乙Py先生のプログラミング教室
初学者のためのプログラミング学習サイト

データベース

今回はRedisを使ったNoSQL入門です。

解説動画はこちら


 

Redisで超簡単NoSQL入門

今回は Redis のお話です。

Redisは
オープンソースのインメモリデータベース(NoSQL)
になります。


Redisの特徴

キーと値の組み合わせ(キー・バリュー型)でデータを保存
すべてのデータをメモリ上に保持し、高速アクセスを実現
永続化(データの保存)も可能
シングルスレッドながら非常に高速な動作
Python, JavaScript, Go など多くの言語に対応
キャッシュやリアルタイム分析に最適です



Redisの仕組み

データは基本的にRAMに格納(超高速アクセス)
サーバーに配置すれば何処からでもアクセス可能
コマンド操作でデータの入出力などを行う

必要に応じてディスクにバックアップ(永続化)
RDB方式(スナップショット型)
一定間隔でメモリの状態を .rdb ファイルに保存



Redisが扱えるデータ構造

次のようなデータ型でデータを保存できます。

String 文字列、数値
List 順序付きリスト(スタック・キュー)
Set 重複のない集合
Sorted Set(ZSet) スコア付き集合(順序あり)
Hash フィールドと値の連想配列
Stream 時系列データのログ
Geo 地理情報(緯度・経度)



Redisの主なユースケース

Webアプリのキャッシュ
セッション管理
メッセージキュー
トークンや一時的なデータの保存



Colab で Redisを動かす

ここからはGoogle Colabで
Redisを動かしていきましょう。

Google Colabにはredis 関連のものが
インストールされていないので
インストール必要があります。


Redisのインストールと起動
!apt-get update > /dev/null
!apt-get install -y redis-server > /dev/null

Redisの起動
!redis-server --daemonize yes

接続確認
!redis-cli ping

Pythonクライアント(redis-py)のインストール
!pip install redis

Pythonでの接続確認
import redis

# Redisに接続
r = redis.Redis(host='localhost', port=6379, db=0)

# 接続テスト → True が返ればOK
r.ping()


ここからはデータの投入方法と
取得方法です。


String型(基本のキー・バリュー)
値のセット
r.set('キー名', '値')

値の取得
r.get('キー名')
※ データはバイト型で返る

# 値の保存(set)と取得(get)
r.set('message', 'こんにちは!')

print(r.get('message').decode())
こんにちは!




数値操作(インクリメント・デクリメント)

インクリメント
r.incr('キー名')

デクリメント
r.decr('キー名') 

# 値のセット(10)
r.set('count', 10)
print(r.get('count').decode())

# インクリメント(11)
r.incr('count')
print(r.get('count').decode())

# デクリメント(10)
r.decr('count')
print(r.get('count').decode())
10
11
10




List型(スタック/キュー構造)

値をキューに追加
r.rpush('キー名', '値1', '値2', '値3')

値をキューから取得(値を削除しつつ取得)
r.lpop('キー名')

値を全件取得
r.lrange('キー名', 0, -1)

# キューに追加(右) 3つ
r.rpush('task_queue', 'task1', 'task2', 'task3')

# キューから取り出す(左) → task1
print(r.lpop('task_queue').decode())

# 全件取得
print(r.lrange('task_queue', 0, -1))
task1
[b'task2', b'task3']




Hash型(辞書データ)

値のセット
r.hset('キー名', mapping=値)

値の取得(一部)
r.hget('キー名', 'キー名')

値の取得(全部)
r.hgetall('キー名')

# ユーザーデータを登録
r.hset('user:1001', mapping={'name': 'Alice', 'age': '30', 'email': 'alice@example.com'})

# 一部の取得
print(r.hget('user:1001', 'email').decode())

# すべての取得
print(r.hgetall('user:1001'))  # バイナリ形式
alice@example.com
{b'name': b'Alice', b'age': b'30', b'email': b'alice@example.com'}




Set型(重複なし集合)

値のセット
r.sadd('キー名', '値1', '値2', '値3')

値の取得(全部)
r.smembers('キー名')

# 値のセット(python は重複しない)
r.sadd('tags', 'python', 'redis', 'ai', 'python')
print(r.smembers('tags'))
{b'ai', b'redis', b'python'}



Sorted Set(ZSet)でランキング

値のセット
r.zadd('キー名', 値)

値の取得(昇順)
r.zrange('キー名', 開始インデックス, 終了インデックス, withscores=True or False)

値の取得(降順)
r.zrevrange('キー名', 開始インデックス, 終了インデックス, withscores=True or False)

# スコア付きで追加(ランキング)
r.zadd('ranking', {'Alice': 100, 'Bob': 80, 'Charlie': 90, 'Jon':20})

# スコアの降順で表示(上位3名)
print(r.zrevrange('ranking', 0, 2, withscores=True))

# スコアの昇順で表示(下位2名)
print(r.zrange('ranking', 0, 1, withscores=False))
[(b'Alice', 100.0), (b'Charlie', 90.0), (b'Bob', 80.0)]
[b'Jon', b'Bob']



キーの一覧と値の削除

キーの一覧を取得
r.keys('*')

値の削除
r.delete("キー名")

# すべてのキー
print(r.keys('*'))  

# 一括削除
r.delete('message', 'count', 'task_queue', 'user:1001', 'tags', 'ranking')  
print(r.keys('*')) 
[b'tags', b'user:1001', b'ranking', b'message', b'count', b'task_queue']
[]



ユースケースでの使い方

デジタル広告業界
広告クリックの誤クリック判定(5秒の一時記録)
クリックから5秒以内のクリックを無効にする

import redis
import time

# Redisに接続(ローカル or クラウド)
r = redis.Redis(host='localhost', port=6379, db=0, decode_responses=True)

def track_ckick(user_id: str, ad_id: str, timeout_sec: int = 5):
    key = f"clicked:{user_id}:{ad_id}"
    if r.exists(key):
        return "No (Already Counted)"
    else:
        r.setex(key, timeout_sec, 1)
        return "OK (New Click)"

print(track_ckick("user123", "ad789"))  # => OK
time.sleep(3)
print(track_ckick("user123", "ad789"))  # => NO
time.sleep(3)
print(track_ckick("user123", "ad789"))  # => OK (5秒過ぎた)
OK (New Click)
No (Already Counted)
OK (New Click)



まとめ

Redisが使えるようになると
プログラミングやシステム開発の幅が広がります

様々な業界の多用途にマッチする使い方があり
大規模なキャッシュサーバー構築なども出来るので
システム開発ではNoSQLの使用は必須項目です

まずは入門編で使い方を学んでみましょう
それでは

今回はSQLiteを用いた
超簡単なデータベース入門です。


解説動画はこちら



超簡単 SQLite入門

今回は
Google Colabでデータベースを使ってみましょう
SQLiteを用いてデータベースの操作の基本を
体験してみましょう


SQLiteとは

軽量な組み込み型データベースです。

一般的なRDBと使い方はほとんど一緒で
単一ファイルで管理されPython標準ライブラリで操作可能です。

小規模アプリ・学習用途に最適です。


データベースの仕組み


データベースはテーブルと呼ばれる
「表」形式のデータを複数組み合わせたものです。

表は複数のカラム(列)が存在し
データ行はレコードと呼ばれています。
スクリーンショット 2025-05-17 16.28.06

カラムはデータの形式によって
異なるデータ型を定義して格納できるようになっています。

通常のRDBはSQL文を用いて
テーブルの操作を行えるようになっています。

今回は詳細なSQL文の内容説明は省きますが
コードを実行すれば、SQL文を実行したことと同じ結果になります。




データベースの接続

ここからはデータベースの接続を行っていきましょう。

Google Colabでは初めから
SQLiteを使えるようになっています。

# データベース作成と接続
import sqlite3

# データベースの作成

# メモリに保存したい場合
# conn = sqlite3.connect(':memory:')

# ファイルに保存したい場合
conn = sqlite3.connect('sample.db')

# 接続
cursor = conn.cursor()

実行するとファイル置き場に
sample.db が出来上がります。



テーブルの作成

データベースを作成したら
その中にテーブルを作る事ができます。

cursor.execute でSQL文(CREATE文)を実行すると
テーブルを作成できます。

# テーブル作成CREATE文
create_query = '''
CREATE TABLE users (
    id INTEGER PRIMARY KEY,
    name TEXT,
    age INTEGER
)
'''
# テーブル作成を実行
cursor.execute(create_query)
conn.commit()

# テーブルの確認
query = "select name from sqlite_master where type = 'table';"
cursor.execute(query)
cursor.fetchall()


データの投入

INSERT文を実行してデータを投入することができます。

INSERT INTO テーブル名 VALUES (?, ?, ?)

テーブルのカラムの個数と
? の個数を合わせておく必要があります。

投入するデータも、カラムの個数に合わせた
リスト型で定義しましょう。

# データを3件挿入
users_data = [
    (1, 'Alice', 25),
    (2, 'Bob', 30),
    (3, 'Charlie', 22)
]
cursor.executemany('INSERT INTO users VALUES (?, ?, ?)', users_data)
conn.commit()

ここまで実行すると、3件分のデータが格納されると思います。


データの取得

データの取得は
SELECT文を実行してデータを取得する事ができます。

SELECT 抽出カラム FROM テーブル名

# 全件取得
cursor.execute('SELECT * FROM users')
rows = cursor.fetchall()

# 結果を表示
for row in rows:
    print(row)
(1, 'Alice', 25)
(2, 'Bob', 30)
(3, 'Charlie', 22)



条件付きでデータ取得(WHERE)

SELECT文のWHERE句を加えると
条件を指定することができます。

SELECT 抽出カラム FROM テーブル名 WHERE 条件

# 条件付きで取得(年齢 > 23) 
cursor.execute('SELECT name FROM users WHERE age > 23')
print(cursor.fetchall())

[('Alice',), ('Bob',)]



データの更新(UPDATE)

UPDATE文を実行するとデータを更新することができます。

UPDATE テーブル名 SET 更新カラム名 WHERE 条件

# データの更新(Bobの年齢を35に)
cursor.execute("UPDATE users SET age = 35 WHERE name = 'Bob'")
conn.commit()
cursor.execute('SELECT * FROM users')
print(cursor.fetchall())
[(1, 'Alice', 25), (2, 'Bob', 35), (3, 'Charlie', 22)]


データの削除(DELETE)

データの削除はDELETE文を実行して行えます。

DELETE FROM テーブル名 WHERE 条件

# データの削除(Charlieを削除)
cursor.execute("DELETE FROM users WHERE name = 'Charlie'")
conn.commit()
cursor.execute('SELECT * FROM users')
print(cursor.fetchall())
[(1, 'Alice', 25), (2, 'Bob', 35)]



Pandasライブラリでデータ取得

pandasデータフレームでもテーブルからデータ取得できます。

import pandas as pd

df = pd.read_sql_query("SELECT * FROM users", conn)
df


応用編

ビットコインの取引データを取得してテーブルに格納する

取引データを格納するデータベースとテーブルを新たに作ります。
import requests
import sqlite3

# SQLiteデータベースの接続
conn = sqlite3.connect('trades.db')
cursor = conn.cursor()

# 取引テーブルの作成
cursor.execute('''
CREATE TABLE IF NOT EXISTS trades (
    id INTEGER PRIMARY KEY,
    amount REAL,
    rate REAL,
    pair TEXT,
    order_type TEXT,
    created_at DATETIME
)
''')

次のコードを実行すると取引データをDBに格納できます。

# 取引データを取得
# コインチェックのAPIエンドポイント
url = 'https://coincheck.com/api/trades'
params = {'pair': 'btc_jpy', 'limit': 100}
response = requests.get(url, params=params)
data = response.json()

if data['success']:
    # 取引データをデータベースにUPSERT
    for trade in data['data']:
        cursor.execute('''
        INSERT INTO trades (id, amount, rate, pair, order_type, created_at)
        VALUES (?, ?, ?, ?, ?, ?)
        ON CONFLICT(id) DO UPDATE SET
        amount = excluded.amount,
        rate = excluded.rate,
        pair = excluded.pair,
        order_type = excluded.order_type,
        created_at = excluded.created_at
        ''', (trade['id'], float(trade['amount']), float(trade['rate']), trade['pair'], trade['order_type'], trade['created_at']))
    conn.commit()

conn.close()
print("取引データの取得とUPSERTが完了しました。")


ここから先は
Pandasデータフレームで取引データを見てみましょう。

import pandas as pd
import sqlite3

conn = sqlite3.connect('trades.db')
cursor = conn.cursor()

df = pd.read_sql_query("SELECT * FROM trades", conn)

# created_atをdatetime型に変換
df['created_at'] = pd.to_datetime(df['created_at'])
df.set_index('created_at', inplace=True)

取引データを1分単位で集計してみやすくします。
minute_candles = df.resample('min').agg(
    open=('rate', 'first'),
    high=('rate', 'max'),
    low=('rate', 'min'),
    close=('rate', 'last'),
    volume=('amount', 'sum'),
    count=('rate', 'count')
).dropna()

minute_candles["volatility"] = minute_candles["high"] - minute_candles["low"]
minute_candles["volatility_rate"] = minute_candles["volatility"] / minute_candles["close"]
minute_candles["volume_avg"] = minute_candles["volume"] / minute_candles["count"]
スクリーンショット 2025-05-17 16.27.55



最後は可視化です。
集計したデータをplotlyで可視化します。

import plotly.graph_objects as go
from plotly.subplots import make_subplots

# subplot作成(上下2段)
fig = make_subplots(
    rows=2, cols=1,
    shared_xaxes=True,
    row_heights=[0.7, 0.3],
    vertical_spacing=0.02,
    subplot_titles=('ローソク足チャート', '出来高(Volume)')
)

# ローソク足(上段)
fig.add_trace(
    go.Candlestick(
        x=minute_candles.index,
        open=minute_candles['open'],
        high=minute_candles['high'],
        low=minute_candles['low'],
        close=minute_candles['close'],
        name='Candlestick'
    ),
    row=1, col=1
)

# 出来高(棒グラフ・下段)
fig.add_trace(
    go.Bar(
        x=minute_candles.index,
        y=minute_candles['volume'],
        name='Volume',
        marker_color='gray',
        opacity=0.5
    ),
    row=2, col=1
)

# レイアウト調整
fig.update_layout(
    title='ローソク足 + Volume(出来高)チャート',
    xaxis_rangeslider_visible=False,
    showlegend=False,
    height=600
)
fig.show()
スクリーンショット 2025-05-17 16.27.45





まとめ


SQLiteを用いると
非常に簡単にデータベースをセットアップできます。

データ投入や検索もPythonであれば
数行で行う事ができるので
非常に便利です。

これからSQLやデータベースを勉強したい方は
ぜひSQLiteを使ってみてください。

それでは。

今回は知らない人向けに
データベースとSQLについてを
解説してみました。

営業さんや
これから技術を学ぶ人に
むいていると思います。

解説動画はこちら



内容はめちゃくちゃ簡単な内容で
SQLについても詳細な書き方などについては
触れていません。

全く知らない、触れたことがない人向けで
30分ほどあれば読み追われると思います。

さてまず最初はデータベース編です。

30分で理解する データベースとSQL.003

データベースとは何でしょう?

簡単に言うとデータを効率よく
管理するソフトウェアのことです。

表形式のデータを取り扱いするものは
リレーショナルデータベースと呼ばれ
RDBと略されています。

代表的なものとしては
MysqlやOracleなんかがあります。

30分で理解する データベースとSQL.004

データベース界隈の用語としては
データの最小単位として
テーブルというものがあります。

テーブルは表のことで
行列のデータの集まりです。


テーブルには
カラム:列のこと

30分で理解する データベースとSQL.005
ロウ:行のこと
レコードも1件のデータで
行と同じような扱いです。

行列が交わるところはフィールドです。

スキーマはテーブルの構造を
定義したもので
テーブルのカラムには
データ型と言うものがあります。

テーブルをまとめたものはデータセット

データセットをまとめて
データベースと言っていたりします。

30分で理解する データベースとSQL.010


様々なデータ型が存在します。
カラムは何かしら1つのデータ型で統一して
データが格納されています。

主なデータ型としては
文字列型
整数型
小数型
timestamp型
などがあります。

30分で理解する データベースとSQL.011


ここからはSQLの話です。

まずSQLは
リレーショナルデータベースを
操作するための言語です。

テーブルにデータを格納したり
テーブルからデータを抽出したりする際に
使用することができます。

今回は実際にSQLの実行環境などを
紹介しませんので、SQLや
文法の触りだけの紹介になります。

SQLには
DML
DDL
DCL
という3つの系統があり
それぞれにいくつかの文が存在します。


30分で理解する データベースとSQL.014

今回はその中でもよく使われる
DMLについてのみご紹介します。



一番最初はSELECT文からです。

SELECT文はデータを
抽出・参照するための文です。

たくさんの「句」で構成され
順番通りに書いて実行すると
条件に応じた結果が
出力されるというものです。

30分で理解する データベースとSQL.016
基本構成としては
7つの句があります。

1.SELECT句
2.FROM句

3.WHERE句
4.GROUP BY句
5.HAVING句
6.ORDER BY句
7.LIMIT句

上二つは何をどこから
を指定します。

下の5つは
どういう条件で抽出するか
抽出条件を書くところになります。

一番上はSELECT句です。
SELECT句は出力する物を
指定するところで
基本はカラム名を書きます。

複数ある場合は
カンマ「,」でつなぎます。


30分で理解する データベースとSQL.017

出力時はそのカラム名で
出力されますが
AS で別名をつけたりできます。

30分で理解する データベースとSQL.018

FROM句はどこのテーブルから
抽出をするか
テーブル名を書くところです。

30分で理解する データベースとSQL.019

WHERE句は条件指定をする所で
基本的にはカラムの値を条件にして
指定します。

その値に該当する結果が


30分で理解する データベースとSQL.020

GROUP BY句は
指定したカラムの値でグループ化し
そのグループ化したもので
別のカラムの値を集計することができます。

集計には集計関数を用います。


30分で理解する データベースとSQL.021



HAVING句は
GROUP BY句で指定したグループ化後の
集計結果をさらに絞り込む指定を
するところになります。


30分で理解する データベースとSQL.022


ORDER BY句は
並び替えの指定をするところです。

カラムの値で昇順か降順に
並び替えが行われます。

30分で理解する データベースとSQL.023

LIMIT句は単純に
出力行数を制御するところです。


30分で理解する データベースとSQL.024
基本構文の他にも
UNION句
JOIN句
WITH句
などが使えます。

UNION句は
縦に結果をつなげるイメージです。

SELECT文同志を
UNION句でつなげたりします。


30分で理解する データベースとSQL.026

JOIN句は横につなげるイメージで
4通りの指定方法があります。

FROM句の後に
JOIN句でくっつけたいテーブルを指定し
双方にあるデータをキーにして
片方のテーブルにしかないデータを
横につなげることができます。


30分で理解する データベースとSQL.027

30分で理解する データベースとSQL.028

INNER JOINはデフォルトで
双方のテーブルにある
データが結合します。

LEFT JOINは左側に対して
右側にある物をくっつけます。
RIGHT JOINはその逆です。

FULL JOINは全てのデータを
くっつけます。

FROMの後に書いた方が左側
JOIN句に書いたものが右側になります。

WITH句は一時的なテーブルを作成でき
後続のSQLでそのテーブルを利用できます。


30分で理解する データベースとSQL.029



INSERT文はテーブルにデータを追加します。

30分で理解する データベースとSQL.030


UPDATE文はデータの更新を行い
条件指定した行のデータを書き換えます。

30分で理解する データベースとSQL.031

DELETE文はデータの削除を行い
条件指定した行の削除を行います。

30分で理解する データベースとSQL.032

以上
簡単ではありますが
データベースとSQLについて
紹介を行いました。

実際に業務で取り入れる際は
データベースをインストールしたり
実行環境を整備したり
するのが必要になります。

まずはどんなものなのか
知識を蓄えておくと
良いのかなと思います。

今回はここまでです
それでは。


このページのトップヘ