Menu

SQLiteとは?組み込み型SQLデータベース入門

SQLiteは、サーバーを立てずにアプリの中で動く、ファイル1つで完結するSQLデータベースです。普通のDBサーバーとの違いや、どんな場面で活躍するのかを解説します。

このページのコードはエディタで実行できます — 編集してすぐに結果を確認できます。

SQLite はプログラムに組み込むデータベース

MySQL、Postgres、SQL Server——名前を聞いたことがあるデータベースの多くは、独立したプログラムとして動きます。サーバーを起動し、ポートで待ち受け、アプリケーションがネットワーク越しに接続してクエリを投げる、というモデルですね。SQLite はこの仕組みをまるごと捨てています。

SQLite の正体はライブラリです。プログラムにリンクするだけで、ディスク上のたった 1 つのファイルに収まる SQL データベースが手に入ります。サーバーレスでポートも不要、デーモンも pg_ctl start もありません。アプリケーションが開くそのファイルが、そのままデータベース_そのもの_なのです。

sqlite3 mydata.db

このコマンドを実行すると、mydata.db というファイルが開かれる(なければ新規作成される)と同時に、SQL プロンプトが立ち上がります。テーブルも行もインデックスも、すべてこの 1 つのファイルに収まります。別のマシンにコピーすればデータベースごと持ち運べますし、ファイルを削除すればデータベースもまるごと消える、というわかりやすさです。

SQL をざっと眺めてみる

SQL の書き方自体は、他の RDBMS とほとんど同じです。MySQL や PostgreSQL を触ったことがあれば、ほぼ違和感なく書けるはずです。

標準的な SQL — CREATE TABLEINSERTSELECTORDER BY。普段の業務で実際に使う SQL 標準の機能はひと通り揃っていて、CTE、ウィンドウ関数、JSON 関数といったモダンな機能もちゃんと使えます。Postgres や MySQL との違いは、主に型の扱いと細かな構文のクセくらいで、これは後ほど取り上げます。

「組み込み」と「サーバーレス」の本当の意味

SQLite を語るときに必ず出てくる 2 つのキーワードがあります。ここでしっかり整理しておきましょう。

組み込み(embedded) とは、SQLite がアプリケーションと同じプロセス内で動くという意味です。データベース専用のプロセスは別に立ち上がりません。Python スクリプトで sqlite3.connect("data.db") を呼ぶと、SQL エンジンは Python プロセスの中で 動き、ファイルを直接読み書きします。

サーバーレス とは、インストール・設定・起動・セキュリティ対策・バックアップが必要なサーバーが存在しないということ。データベースを使い始めるまでの手順を比べてみましょう。

  • Postgres: Postgres をインストール → サービスを起動 → ユーザー作成 → データベース作成 → pg_hba.conf を設定 → TCP で接続。
  • SQLite: ファイルを開く。

差はこれだけです。できることは少なくなりますが、その代わり手間が圧倒的に少ない。

データベース全体がたった 1 つのファイル

ここが多くの人を驚かせるポイントです。ファイルフォーマットは公開されていて安定しているので、.db(あるいは .sqlite.sqlite3 — 拡張子は単なる慣習です)ファイルに対して、こんなことができます。

  • 同僚にメールで送る。
  • git にコミットする(サイズが小さければ、ですが)。
  • cp でコピーすれば、それだけで即席バックアップ。
  • どんな OS でも、SQLite 対応ツールならそのまま開ける。
ls -lh mydata.db
# -rw-r--r--  1 you  staff   28K  Apr 23 14:02 mydata.db

この1つのファイルに、テーブルもインデックスもスキーマもデータも、すべてが収まっています。ディスク上の SQLite データベースは、Windows、macOS、Linux、iOS、Android のいずれでもバイト単位で完全に同一です。フォーマットは非常に安定しており、米国議会図書館が長期データ保存用フォーマットとして推奨しているほどです。

あなたはすでに SQLite を使っている

今この記事を読んでいるデバイスの中にも、SQLite データベースは間違いなく数百個は存在しています。たとえば、こんなところで動いています。

  • iOS や Android のシステムストレージ、そして両プラットフォームの多くのアプリ
  • Firefox、Chrome、Safari(履歴、ブックマーク、Cookie)
  • macOS(メール、写真、Dock)
  • ローカルストレージを必要とする Linux デスクトップアプリの大半
  • Skype、WhatsApp、Signal のチャット履歴
  • Adobe Lightroom のカタログ、Dropbox のメタデータ、Steam のライブラリ

「世界で最も広く使われているデータベースエンジン」と呼ばれることもあり、これはおそらく事実です。理由はシンプルで、アプリにローカルの構造化ストレージが必要になったとき、SQLite が一番手軽な選択肢だからです。

SQLite が向いていないこと

SQLite はクライアント・サーバー型のデータベースではありません。別々のマシンで動く2つのプログラムが、ネットワーク経由で同じ SQLite データベースに接続することはできません。そもそも接続するためのネットワーク層が存在しないからです。そういう用途なら Postgres や MySQL を使うべきです。

書き込みの高並行処理にも向いていません。SQLite はファイル単位のロックを使っており(WAL モードでいくつか巧妙な最適化はありますが)、読み込みは多数を並列で処理できる一方、書き込みのコミットは同時に1つしか通りません。シングルユーザーのアプリや低トラフィックのサイトなら問題になりませんが、毎秒数千件の書き込みが走るマルチテナントの SaaS には不向きです。

ユーザー管理や権限管理の機能もありません。データベースへのアクセス権限は、ファイルへのアクセス権限そのものです。ファイルを読める人はデータも読めます。自分自身でデータベースファイルを所有するアプリなら問題ありませんが、共有のマルチテナント構成には向きません。

SQLite を選ぶ理由

得られるのはシンプルさ。引き換えに失うのは、たぶん必要にならないであろうスケーラビリティの余地です。

  • セットアップ不要。 起動すべきサービスがありません。開発と本番でバージョンがズレることもありません。「データベースサーバーが落ちた」という障害自体がそもそも起きません。サーバーが存在しないので。
  • 高速。 ほとんどのワークロード、特に読み込みが多いケースでは、ネットワーク越しのデータベースより SQLite のほうが速いです。クエリごとのソケット往復がないからです。
  • 信頼性が高い。 とにかく徹底的にテストされています。SQLite プロジェクトはソースコードよりテストコードのほうが圧倒的に多く、フォーマット自体も2004年以来安定しています。
  • パブリックドメイン。 商用利用も含めて完全に自由に使えます。読むべきライセンス文書すらありません。
  • ポータブル。 1ファイルで、すべてのプラットフォームに対応。

ローカルアプリ、プロトタイプ、組み込み機器、CLI ツール、テストスイート、データ分析スクリプト、それから中小規模のウェブサイト。こうした用途では、SQLite はしばしば「本物のデータベース」への踏み台ではなく、正解 のデフォルト選択肢になります。

次回:SQLite と MySQL の違い

ここで自然に出てくる疑問が、もっと耳にする機会の多いデータベースサーバーと比べて SQLite はどうなのか、というものです。次回はまず MySQL を取り上げ、それぞれが得意とする領域と、目の前のプロジェクトにどちらが合うかの見極め方を解説します。

よくある質問

SQLiteとは何ですか?

SQLiteは、独立したサーバーではなくライブラリとしてアプリの中で動作するSQLデータベースエンジンです。テーブルもインデックスも、スキーマもデータも、すべてディスク上のたった1つのファイルに収まります。Cライブラリ(または各言語のバインディング)経由で、普通のSQLを使ってやり取りします。

SQLiteは何に使われていますか?

サーバーを立てずに本物のSQLデータベースを使いたい場面、ほぼすべてです。モバイルアプリ(iOSもAndroidも標準で搭載)、デスクトップアプリ、ブラウザ、組み込み機器、小規模なWebサイト、ローカルキャッシュ、テストスイート、データ分析スクリプトなど。データが1台のマシンに収まり、書き込みが基本1プロセスからなら、たいていSQLiteで足ります。

SQLiteはちゃんとしたデータベースなんですか?

はい、れっきとしたDBです。トランザクション、ACID特性、外部キー、JOIN、サブクエリ、ウィンドウ関数、CTE、トリガー、ビュー、JSONまでサポートしています。ネットワーク越しのアクセスや複数ライターの同時書き込み、ユーザー管理といったサーバー型DBの機能はありませんが、それはSQLiteの守備範囲外なだけ。単一プロセスのアプリで使う分には、Postgresと同じくらい「本物」のデータベースです。

SQLiteは無料で使えますか?

はい、完全に無料です。SQLiteはパブリックドメインで公開されており、一般的なオープンソースよりさらに自由度が高いライセンスです。商用製品への組み込みも、改変も、クレジット表記やライセンス料なしで配布も可能です。世界で最も広くデプロイされているソフトウェアの1つになっているのは、こうした理由からです。

Coddy programming languages illustration

Coddyでコードを学ぼう

始める