Python | DB・SQL:SQLite

Python
スポンサーリンク

SQLite ってそもそも何者?

SQLite(エスキューライト)は、「組み込み型」のリレーショナルデータベースです。
PostgreSQL や MySQL みたいに「サーバーを立てて接続するタイプ」ではなく、
「1 個のファイルがそのままデータベース」になっている、超軽量な RDB です。

インストールもサーバー起動もいりません。
Python には標準で sqlite3 モジュールが入っているので、
「Python だけあれば、すぐに SQL を試せるデータベース」として、学習にも小規模アプリにも最高の相棒です。

ローカル開発、個人ツール、デスクトップアプリ、スマホアプリ(Android/iOS)などでよく使われます。
まずは「SQLite の立ち位置」と「何が嬉しいのか」から押さえましょう。


SQLite のイメージをつかむ

「1 ファイルで完結する小さなデータベース」

普通の RDB(PostgreSQL など)は、
サーバープロセスを起動して、クライアント(アプリ)が TCP で接続します。

一方 SQLite は、
「.db ファイル(例:app.db)」が 1 個あるだけです。
そのファイルを Python やアプリが直接読み書きします。

イメージとしては、

Excel ファイルが 1 個 → その中にシート(テーブル)がある
SQLite ファイルが 1 個 → その中にテーブルがある

という感じです。

サーバーを立てる必要がないので、

環境構築がめちゃくちゃ楽
配布もしやすい(ファイルをコピーするだけ)
小さなツールや学習用途にぴったり

というメリットがあります。

それでも中身は「ちゃんとした RDB」

軽いからといってオモチャではありません。
SQLite も立派な RDB なので、

テーブル定義(CREATE TABLE)
SQL(SELECT / INSERT / UPDATE / DELETE)
トランザクション(BEGIN / COMMIT / ROLLBACK)

といった「RDB の基本」は一通り使えます。

つまり、「SQL を学ぶ」「DB 設計を練習する」には十分すぎる機能を持っています。
本番で大規模トラフィックをさばくには向きませんが、
学習・試作・小規模アプリにはかなり実用的です。


Python から SQLite を触る基本(sqlite3)

まずは「接続してテーブルを作る」まで

Python には標準で sqlite3 モジュールが入っています。
追加インストールなしで、いきなりこう書けます。

import sqlite3

# app.db というファイルに接続(なければ作られる)
conn = sqlite3.connect("app.db")

cur = conn.cursor()

# users テーブルを作成
cur.execute(
    """
    CREATE TABLE IF NOT EXISTS users (
        id     INTEGER PRIMARY KEY AUTOINCREMENT,
        name   TEXT NOT NULL,
        email  TEXT UNIQUE NOT NULL
    )
    """
)

conn.commit()
conn.close()
Python

ここでやっていることを分解すると、

connect("app.db") で app.db という SQLite ファイルに接続
cursor() で SQL を実行するためのカーソルを取得
CREATE TABLE でテーブルを作成
commit() で変更を確定

という流れです。

IF NOT EXISTS を付けているので、
同じスクリプトを何度実行しても「テーブルがすでにある」というエラーになりません。

データを INSERT して SELECT してみる

次に、データを入れて取り出してみます。

import sqlite3

conn = sqlite3.connect("app.db")
cur = conn.cursor()

# データ挿入(プレースホルダを使うのが安全)
cur.execute(
    "INSERT INTO users (name, email) VALUES (?, ?)",
    ("Taro", "taro@example.com"),
)

cur.execute(
    "INSERT INTO users (name, email) VALUES (?, ?)",
    ("Hanako", "hanako@example.com"),
)

conn.commit()

# データ取得
cur.execute("SELECT id, name, email FROM users")
rows = cur.fetchall()

for row in rows:
    print(row)

conn.close()
Python

ポイントは、VALUES (?, ?) のように ? プレースホルダを使い、
値をタプルで渡しているところです。
これは SQL インジェクションを防ぐための基本パターンで、
SQLite に限らず他の DB でも同じ考え方です。


SQLite での SQL 基本操作(例題付き)

WHERE で絞り込み

例えば、「メールアドレスでユーザーを検索したい」とします。

cur.execute(
    "SELECT id, name, email FROM users WHERE email = ?",
    ("taro@example.com",),
)
user = cur.fetchone()
print(user)
Python

fetchone() は 1 行だけ取りたいときに使います。
該当がなければ None が返ります。

UPDATE と DELETE

ユーザー名を更新したり、ユーザーを削除したりも普通にできます。

# 名前を更新
cur.execute(
    "UPDATE users SET name = ? WHERE email = ?",
    ("Taro Yamada", "taro@example.com"),
)

# 削除
cur.execute(
    "DELETE FROM users WHERE email = ?",
    ("hanako@example.com",),
)

conn.commit()
Python

ここでも、commit() を忘れると変更がファイルに保存されません。
SQLite でもトランザクションの概念はちゃんとあります。


SQLite のトランザクションをイメージする

「一連の処理をまとめて確定する」

SQLite も ACID トランザクションをサポートしています。
Python の sqlite3 では、デフォルトで「自動コミット」がオフになっていることが多く、
commit() を呼ぶまでは変更が確定しません。

複数の操作をまとめて「全部成功したら反映したい」ときは、
トランザクションとして扱うイメージを持つと良いです。

conn = sqlite3.connect("app.db")
cur = conn.cursor()

try:
    # トランザクション開始(明示的に BEGIN してもよい)
    cur.execute("BEGIN")

    cur.execute(
        "INSERT INTO users (name, email) VALUES (?, ?)",
        ("Ken", "ken@example.com"),
    )

    cur.execute(
        "UPDATE users SET name = ? WHERE email = ?",
        ("Taro Updated", "taro@example.com"),
    )

    conn.commit()  # ここで一気に確定
except Exception:
    conn.rollback()  # 何かあれば全部取り消し
    raise
finally:
    conn.close()
Python

SQLite はシングルファイルなので、
複数プロセスからの同時書き込みには制限がありますが、
「一連の処理をまとめて成功/失敗にする」という意味では、
他の RDB と同じ感覚でトランザクションを使えます。


SQLite の「得意なこと」と「苦手なこと」

得意:学習・試作・小規模アプリ・ローカルツール

SQLite が輝く場面はかなりはっきりしています。

ローカルで SQL を学びたい
小さな CLI ツールやデスクトップアプリのデータ保存
スマホアプリのローカル DB(Android/iOS)
テスト環境やプロトタイプ

こういう場面では、

サーバーいらない
ファイル 1 個で完結
Python 標準ライブラリだけで触れる

という特徴が、圧倒的なメリットになります。

Django でも、デフォルトは SQLite です。
開発中は SQLite、本番は PostgreSQL という構成もよくあります。

苦手:高トラフィック・大量同時書き込み・複雑なスケール

一方で、SQLite は「サーバー型 RDB の代わり」にはなりません。

同時に大量の書き込みが来る Web サービス
複数サーバーから同じ DB にアクセスする構成
巨大なデータ量(数百 GB〜)

こういった用途では、PostgreSQL や MySQL のようなサーバー型 RDB が向いています。

SQLite は「1 プロセス or 少数プロセスからのアクセス」「そこまで激しくない書き込み」が前提の設計です。
だからこそ、シンプルで軽くて扱いやすい、という側面もあります。


SQLite を学ぶときのおすすめステップ

ステップ1:SQLite で「SQL の基礎」を全部やる

まずは SQLite を使って、

CREATE TABLE
INSERT / SELECT / UPDATE / DELETE
WHERE / ORDER BY / GROUP BY / JOIN

といった SQL の基本を一通りやってみるのがおすすめです。

理由はシンプルで、

環境構築がほぼゼロ
Python からも psql 的なツールからもすぐ触れる
「SQL の文法」は他の RDB とほぼ共通

だからです。

SQLite で SQL に慣れておけば、
PostgreSQL や MySQL に移ったときも、
「サーバーに接続する部分」以外はほぼ同じ感覚で書けます。

ステップ2:Python からの DB アクセスの型を身につける

次に、Python からの DB アクセスの「型」を身につけます。

接続を開く
カーソルを作る
プレースホルダ付きで SQL を実行する
結果を fetchone / fetchall で受け取る
トランザクションを commit / rollback で制御する

この流れは、SQLite でも PostgreSQL でも同じです。
SQLite でこの型を体に染み込ませておくと、
他の DB に乗り換えたときも迷いません。


まとめ(SQLite は「最初の一歩」と「小さな本番」の両方を支えてくれる)

SQLite を初心者目線でまとめると、こうなります。

サーバー不要・ファイル 1 個で完結する、超軽量なリレーショナルデータベース。
Python には標準で sqlite3 が入っているので、「Python だけで SQL と DB を学べる」最高の教材になる。
SQL の基本(CREATE TABLE / SELECT / INSERT / UPDATE / DELETE)も、トランザクションも、ちゃんと使える「本物の RDB」。
学習・試作・ローカルツール・小規模アプリにはかなり実用的だが、大規模・高トラフィック用途にはサーバー型 RDB(PostgreSQL など)が向く。

タイトルとURLをコピーしました