SQLite のデータベースは単なるファイル
MySQL や Postgres を使ってきた方なら、CREATE DATABASE myapp; を実行すればサーバーが裏側で新しいデータベースを作ってくれる、という流れに慣れているはずです。SQLite はこの仕組みとは違います。サーバーもなければ、CREATE DATABASE 文も存在しません。SQLite のデータベースの実体は、ディスク上にあるたった1つのファイルです。拡張子は .db、.sqlite、.sqlite3 あたりが定番ですが、これはあくまで慣習で、何でも構いません。
新しいデータベースを作りたいときは、まだ存在しないファイル名を sqlite3 コマンドに渡すだけで済みます。
sqlite3 mydata.db
以上です。mydata.db がなければ SQLite が新しく作ってくれますし、すでにあるなら開くだけ。同じコマンドでどちらも処理してくれます。感覚としては「データベースサーバーを立ち上げる」というより「ドキュメントを開く」に近いです。
何か書き込むまで .db ファイルは作成されない
ここでハマる人が多いポイントです。さっきのコマンドを実行して .quit で抜けてから、ディレクトリを確認してみてください。ファイルがないんです。
SQLite は怠け者なんですね。中身が空のうちは、わざわざディスクにファイルを書き出しません。テーブルを作ったりデータをコミットしたりした瞬間に、初めてファイルが姿を現します。
これで mydata.db がディスク上に作られます。最初の書き込みが発生するまで、「データベース」はコネクションのメモリ内にしか存在しません。最初は戸惑うポイントですが、裏を返せば、途中で中断したセッションは何の痕跡も残さないということでもあります。
CLIからのSQLiteデータベース作成
シェルを開いてから一通り実行する流れは次のとおりです。
$ sqlite3 mydata.db
SQLite version 3.45.0
Enter ".help" for usage hints.
sqlite> CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT);
sqlite> .databases
main: /home/you/mydata.db r/w
sqlite> .quit
シェルに入ったときに覚えておくと便利な CLI コマンドをいくつか紹介します。
.databases— アタッチされているデータベースとそのファイルパスを一覧表示します。.tables— 現在のデータベースにあるテーブルを一覧表示します。.schema— すべてのテーブルのCREATE TABLE文を表示します。.quit— 終了します。
引数なしで sqlite3 を起動してしまい、まだファイルを開いていない状態でも大丈夫です。次のように .open でファイルをアタッチできます。
sqlite> .open mydata.db
同じルールで、ファイルがなければ作成、あれば開くだけです。
"If Not Exists" は最初から組み込み済み
他のデータベースから来た人がよく心配するのが、「もしファイルが既に存在してたら上書きされちゃうの?」という点。安心してください、上書きはされません。既存のファイルを開けば、ただ開くだけです。CREATE DATABASE IF NOT EXISTS に一番近い動作は、要するに「ファイルを開く」こと。SQLite では、新規作成も既存ファイルのオープンも同じコマンドで処理されます。
どうしてもまっさらな状態から始めたい場合は、先にファイルを削除しておきましょう。
rm mydata.db
sqlite3 mydata.db
ただし、本当に削除していいかはしっかり確認してください。Undo機能はありませんし、復元用の管理ツールも用意されていません。
Pythonでsqliteデータベースを作成する
実際の開発では、CLIから操作することはあまりなく、アプリケーションのコード側からデータベースを作るケースがほとんどです。Pythonには標準ライブラリとして sqlite3 モジュールが同梱されているので、追加インストールは不要です。
sqlite3.connect("mydata.db") も CLI と挙動は同じです。ファイルがなければ作り、あれば開く。それだけ。Node の better-sqlite3、Go の database/sql ドライバ、Rust の rusqlite など、他言語のバインディングも同様の動きをします。中身はどれも同じ C ライブラリのラッパーなので当然ですね。
Python 限定の小技として、パスに ":memory:" を渡すと完全に RAM 上で動く SQLite インメモリデータベースを作成できます。コネクションを閉じた瞬間に消える、いわゆる使い捨てDBです。これは次のページで詳しく扱います。
.db ファイルはどこに置くべき?
SQLite のデータベースは結局ただのファイルなので、「どこに置くか」は実用上の重要な問題です。目安を挙げておきます。
- アプリの場合: ユーザーのデータディレクトリ配下、もしくはアプリの作業ディレクトリに置きましょう。実行ファイルの隣に置くのは、そのパスが書き込み不可な OS もあるのでおすすめしません。
- プロジェクトの場合: リポジトリのルートか
data/フォルダ配下が定番です。ローカル状態を持つ場合は.gitignoreに追加しておきましょう。バイナリの DB ファイルを Git にコミットしてもロクなことになりません。 - テストの場合:
:memory:か一時ファイルを使うのがベスト。速いし、後片付けも不要です。
権限まわりも要注意。プロセスを実行するユーザーは、DB ファイル本体_と_その親ディレクトリの両方に読み書き権限が必要です(書き込み時に SQLite が同じディレクトリにロックファイルを作るため)。
動作確認をサクッと
ここまでの流れがちゃんと動くか、一通り試してみましょう。
行が 2 件返ってくれば成功です。これで、データベースファイルが存在し、スキーマが書き込まれ、データもクエリできる状態になっています。SQLite における「データベースを作成する」というのは、これだけの話です。サーバーもユーザーも権限テーブルもありません。ただのファイル 1 つです。
次は: SQLite インメモリデータベース
ファイルを作るのと同じ sqlite3.connect(...) でも、引数を変えればディスクに一切触れないデータベースを作れます。インメモリデータベースは、テストの実行、スキーマのプロトタイピング、一時データの保持を最速でこなせる手段です。次の章で詳しく見ていきましょう。
よくある質問
SQLiteでデータベースを作成するにはどうすればいいですか?
シェルで sqlite3 mydata.db と実行するだけです。mydata.db が存在しなければ新しく作成され、すでにあればそのまま開きます。SQLiteには独立した CREATE DATABASE 文はなく、ファイルそのものがデータベースという考え方です。
SQLiteに CREATE DATABASE 文はありますか?
ありません。MySQLやPostgreSQLとは違い、SQLiteには CREATE DATABASE というSQL文は存在しません。sqlite3 コマンドやPythonの sqlite3 モジュールなどから、まだ存在しないファイル名を指定して接続した瞬間にデータベースが作られます。
新しく作ったSQLiteのファイルが空、または見つからないのはなぜ?
SQLiteは遅延書き込みの仕組みになっていて、最初のテーブルを作成したりトランザクションをコミットするまで、実際にはファイルをディスクに書き出しません。sqlite3 mydata.db を実行してすぐ終了するだけだとファイルは作られないので、テーブルを1つ作るか .databases を実行すれば、ファイルが実体化します。
PythonからSQLiteのデータベースを作るには?
標準ライブラリの sqlite3 モジュールをインポートして、sqlite3.connect('mydata.db') を呼び出すだけです。ファイルがなければ自動的に作成されます。パスに ':memory:' を指定すると、ディスクに書き出さないオンメモリの一時データベースになります。