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)
Pythonfetchone() は 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()
PythonSQLite はシングルファイルなので、
複数プロセスからの同時書き込みには制限がありますが、
「一連の処理をまとめて成功/失敗にする」という意味では、
他の 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 など)が向く。
