タイトル: SQLite
SEOタイトル: SQLite 完全ガイド (組み込み RDBMS)
| この記事の要点 |
|
SQLite とは
SQLite はサーバレスでファイルベースの軽量 RDBMSです。MySQL や PostgreSQL のように常駐プロセスが必要なく、アプリケーションがライブラリとして直接 DB ファイル(拡張子 .db / .sqlite / .sqlite3)を読み書きします。

特徴と他 DB との比較
| 項目 | SQLite | MySQL | PostgreSQL |
|---|---|---|---|
| サーバプロセス | 不要(ライブラリ) | 必要 | 必要 |
| 設定ファイル | 不要 | my.cnf | postgresql.conf |
| ファイル構成 | 単一ファイル | 複数ファイル | 複数ファイル |
| 同時書き込み | 1(WAL で改善) | 多数 | 多数 |
| 同時読み込み | 多数 | 多数 | 多数 |
| 最大 DB サイズ | 281 TB | 制限なし | 制限なし |
| 標準型 | 動的型 (TYPEAFFINITY) | 静的型 | 静的型 |
| 用途 | 組み込み・モバイル・開発・小規模 Web | 大規模 Web | 大規模 Web・複雑分析 |
インストールと CLI 操作
# macOS は標準同梱
sqlite3 --version
# Ubuntu / Debian
sudo apt install -y sqlite3 libsqlite3-dev
# Windows
# https://sqlite.org/download.html から sqlite-tools-win.zip
# またはチョコレート: choco install sqlite
# CLI 起動 (mydata.db が無ければ新規作成)
sqlite3 mydata.db
sqlite> CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER);
sqlite> INSERT INTO users (name, age) VALUES ('taro', 25), ('hanako', 30);
sqlite> SELECT * FROM users;
1|taro|25
2|hanako|30
sqlite> .exit
主要ドット コマンド
| コマンド | 説明 |
|---|---|
.tables | テーブル一覧 |
.schema tablename | CREATE TABLE 文表示 |
.dump | 全データを SQL でダンプ |
.read file.sql | SQL ファイル実行 |
.mode column | 表形式表示 |
.headers on | 列ヘッダー表示 |
.import data.csv users | CSV インポート |
.output result.txt | 結果をファイルへ |
.backup backup.db | オンラインバックアップ |
.exit / .quit | 終了 |
各言語からの利用
Python (標準同梱の sqlite3 モジュール)
import sqlite3
conn = sqlite3.connect("mydata.db")
cur = conn.cursor()
cur.execute("CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT)")
cur.execute("INSERT INTO users (name) VALUES (?)", ("taro",))
conn.commit()
for row in cur.execute("SELECT * FROM users"):
print(row)
conn.close()
PHP (PDO + SQLite)
$pdo = new PDO("sqlite:mydata.db");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->exec("CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT)");
$stmt = $pdo->prepare("INSERT INTO users (name) VALUES (?)");
$stmt->execute(["taro"]);
foreach ($pdo->query("SELECT * FROM users") as $row) {
print_r($row);
}
Node.js (better-sqlite3)
const Database = require("better-sqlite3");
const db = new Database("mydata.db");
db.exec("CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT)");
const insert = db.prepare("INSERT INTO users (name) VALUES (?)");
insert.run("taro");
const users = db.prepare("SELECT * FROM users").all();
console.log(users);
WAL モードで同時書き込み性能を上げる
SQLite のデフォルトは rollback journal モードで書き込み中は読み込みもブロックされます。WAL (Write-Ahead Logging) モードに切り替えると、書き込み中でも読み込み可能になり、Web アプリでも実用的になります。
-- WAL モードに切替(DB ごとに 1 度設定すれば永続化)
PRAGMA journal_mode = WAL;
-- 同期モード(NORMAL でも電源断耐性あり、高速)
PRAGMA synchronous = NORMAL;
-- キャッシュサイズ (KB)
PRAGMA cache_size = -64000; -- 64 MB
-- 外部キー制約有効化(デフォルト OFF!)
PRAGMA foreign_keys = ON;
-- 推奨セット
PRAGMA journal_mode = WAL;
PRAGMA synchronous = NORMAL;
PRAGMA temp_store = MEMORY;
PRAGMA mmap_size = 30000000000;
PRAGMA foreign_keys = ON;
GUI ツール
- DB Browser for SQLite (公式推奨、無料、Win/Mac/Linux)
- SQLiteStudio (無料、機能豊富)
- DBeaver (汎用 DB GUI、SQLite も対応)
- JetBrains DataGrip (有料、IDE 統合)
- TablePlus (有料、洗練 UI)
- VS Code SQLite 拡張(拡張機能で簡単閲覧)
Laravel / Django / Rails での利用
// Laravel .env
DB_CONNECTION=sqlite
DB_DATABASE=/absolute/path/to/database.sqlite
// 作成
touch database/database.sqlite
php artisan migrate# Django settings.py
DATABASES = {
"default": {
"ENGINE": "django.db.backends.sqlite3",
"NAME": BASE_DIR / "db.sqlite3",
}
}
本番利用事例
| 事例 | 説明 |
|---|---|
| iOS / Android のローカル DB | 標準で SQLite を採用、Core Data も内部は SQLite |
| Firefox / Chrome | 履歴・Cookie・Bookmark 保存に利用 |
| WhatsApp / Skype | メッセージ履歴の保存 |
| Cloudflare D1 | エッジ SQLite を SaaS 提供(2023~) |
| Litestream | SQLite を S3 等にレプリケーション |
| Turso | マネージド分散 SQLite(libSQL) |
| 飛行機の機内システム | Boeing 787 / Airbus A350 に組み込み |
SQLite が向くケース・向かないケース
| 向く | 向かない |
|---|---|
| モバイル / 組み込みのローカル DB | 大量同時書き込み(数百 QPS 以上の write) |
| 開発・テスト・CI 環境 | 複数サーバから同じ DB を共有 |
| 小〜中規模 Web サイト(read 多め) | 本格的なレプリケーション要件 |
| データ分析用ローカルキャッシュ | 細粒度のロール・権限制御 |
| シングルバイナリ配布アプリ | 厳密な型制約が必要なシステム |
バージョン情報
2026 年現在の最新は SQLite 3.45+。JSON 関数、UPSERT、Window 関数、Generated Column、FTS5 全文検索、R-Tree 地理空間など現代的機能が揃っています。
FAQ
Q: 拡張子は .db / .sqlite / .sqlite3 どれが正解?
A: どれでも動作します。慣習として SQLite 3 を示す .sqlite3 が分かりやすく、Django もこれをデフォルトに採用。
Q: 同時書き込みは本当にできない?
A: 厳密には 1 つの書き込みトランザクションのみですが、WAL モードでは読み込みは並行、書き込みはミリ秒単位で完了するので、数十 TPS 程度なら問題なく捌けます。
Q: パスワード保護できる?
A: 標準では暗号化なし。SQLCipher 拡張でファイル単位 AES 暗号化可能(iOS の Core Data も内部で使用)。