SQLite CLIとは
sqlite3 は、SQLiteに標準で付属している公式のコマンドラインシェルです。データベースファイルを開いてプロンプトを出し、そこでSQLを叩けるようにしてくれるツールですね。サーバーも不要、ログインも不要、設定ファイルもいりません。バイナリとファイルさえあれば動きます。
sqlite3 コマンドは、データベースの中をサクッと確認したい、ワンライナーでクエリを投げたい、スキーマをダンプしたい、データをインポートしたいといった場面で活躍します。アプリケーションのコードを書かずにDBを触ってみるなら、これが一番手っ取り早い方法です。
$ sqlite3 mydata.db
SQLite version 3.45.0
Enter ".help" for usage hints.
sqlite>
mydata.db がまだ存在しなくても大丈夫です。最初の変更を加えた瞬間に SQLite が自動で作成してくれます。ファイル名を指定せずに sqlite3 を起動すると、使い捨てのインメモリデータベースが開きます。
sqlite3 プロンプトで SQL を実行する
シェルに入ったら、SQL を入力して文の末尾には必ずセミコロンを付けます。シェルはこのセミコロンが来るまで実行を待つので、付け忘れて Enter を押すと、継続入力用のプロンプトが表示されるだけです。
セミコロン ; は「入力おわり、実行して」の合図です。これを忘れると、シェルは ...> というプロンプトのまま、じっと待ち続けます。そんなときは改行して ; を打てば実行されます。
ドットコマンドは SQL ではない
. で始まるものは ドットコマンド と呼ばれ、SQL エンジンではなくシェル自身への命令です。セミコロンは不要で、sqlite3 シェルの中でしか使えません。
sqlite> .tables
books
sqlite> .schema books
CREATE TABLE books (
id INTEGER PRIMARY KEY,
title TEXT NOT NULL,
year INTEGER
);
sqlite> .help
よく使うのは、ざっとこのあたりです。
.tables— 現在のデータベース内のテーブル一覧を表示.schema [table]— 指定したテーブル(または全テーブル)のCREATE TABLE文を表示.databases— アタッチされているデータベースファイルを一覧表示.mode <format>— クエリ結果の表示形式を切り替え.headers on— クエリ結果にカラム名を表示.read file.sql— SQLファイルを実行.exitまたは.quit— シェルを終了
.help を打てば全コマンドが表示されます。数は多いですが、実際によく使うのは10個くらいに落ち着きます。
出力を見やすくする
デフォルトの出力はパイプ区切りでヘッダーもなし。スクリプトで処理するならいいんですが、目で読むにはちょっとつらい。これは2つのドットコマンドで一気に解決できます。
sqlite> .headers on
sqlite> .mode column
sqlite> SELECT * FROM books;
id title year
-- ----------- ----
1 Dune 1965
2 Neuromancer 1984
その他に便利なモードも紹介しておきます。
.mode box— Unicodeの罫線で表を描画します。スクショ映えします。.mode csv— カンマ区切り形式。他のツールへパイプで渡すのに便利です。.mode json— JSON形式で出力。1行が1オブジェクトになります。.mode line— 1カラムを1行ずつ表示。横に長いレコードを見るときに重宝します。
これらの設定は、シェルを起動し直すたびにリセットされます。常に同じ設定で使いたい場合は、~/.sqliterc ファイルに書いておけば、sqlite3 起動時に自動で読み込まれます。
SQLite で CSV をインポート・エクスポートする
sqlite3 コマンドには CSV を扱う機能が標準で備わっています。CSV モードに切り替えてから、.import でファイルをテーブルに読み込みます。
sqlite> .mode csv
sqlite> .import authors.csv authors
sqlite> SELECT * FROM authors LIMIT 3;
テーブルが存在しない場合は、.import が1行目をカラム名として扱い、新しいテーブルを自動で作成してくれます。すでにテーブルがある場合は、1行目もデータとして取り込まれるので、ヘッダー行を飛ばしたいときは --skip 1 を指定してください。
逆方向、つまりエクスポートしたいときは、出力をファイルにリダイレクトします。
sqlite> .headers on
sqlite> .mode csv
sqlite> .output books.csv
sqlite> SELECT * FROM books;
sqlite> .output stdout
.output filename を実行すると、以降のクエリ結果はすべて指定したファイルに書き出されます。.output stdout で元に戻すまでこの状態が続きます。CSV や JSON、スキーマのダンプなど、出力フォーマットに関わらず仕組みは共通です。
SQLファイルを実行する
数行で済まない処理なら、SQL をファイルにまとめて実行するのが定番です。シェル内ではこう書きます。
sqlite> .read setup.sql
あるいは、シェルに入らずに普段のターミナルからそのまま実行することもできます。
$ sqlite3 mydata.db < setup.sql
$ sqlite3 mydata.db "SELECT count(*) FROM books;"
2 つ目の書き方は、クエリを 1 つだけ実行してそのまま終了するパターンです。シェルスクリプトに組み込んだり、ちょっと確認したいときにぴったりです。出力フォーマットを整えたい場合は、-cmd フラグで .mode を指定して組み合わせると便利です。
$ sqlite3 -header -column mydata.db "SELECT * FROM books;"
中身が分からない .db ファイルを調べる
.db ファイルだけを渡されて、中に何が入っているのか全く分からない——そんなときの定番手順がこれです。
$ sqlite3 mystery.db
sqlite> .tables
sqlite> .schema
sqlite> .indexes
sqlite> SELECT count(*) FROM some_table;
引数なしで .schema を実行すると、ファイル内のすべての CREATE TABLE、CREATE INDEX、CREATE TRIGGER をまとめて出力できます。.indexes を使えばテーブルごとのインデックス一覧も確認できます。たいていの README を読むより、sqlite3 のシェルで5分触ったほうがデータベースの中身がよくわかるはずです。
別の環境でも復元できるテキスト形式のスナップショットが欲しいときは、.dump を使います:
sqlite> .output backup.sql
sqlite> .dump
sqlite> .output stdout
これでスキーマとデータの両方を含む SQL スクリプトが出力され、そのファイルを再度 sqlite3 に流し込めばデータベースをそっくりそのまま復元できます。
sqlite3 シェルの終了方法
終了の仕方は次の 3 通りで、どれを使っても結果は同じです。
sqlite> .exit
sqlite> .quit
あるいは、macOS と Linux なら Ctrl+D、Windows なら Ctrl+Z を押してから Enter でも終了できます。変更内容はすでに保存済みです。SQLite は明示的にトランザクションを開始していない限り、各ステートメントを実行するたびに自動でコミットしてくれます。
次は SQLite の GUI ツール
CLI は動作が軽くてスクリプトにも組み込みやすい一方、テーブルをクリックして眺めたり、カラムでソートしたり、行を見ながら編集したい場面もありますよね。SQLite には使い勝手のいい GUI ツールがいくつかあるので、次のページで紹介していきます。
よくある質問
SQLite CLIでデータベースを開くには?
ターミナルで sqlite3 mydata.db を実行するだけです。ファイルが存在しなくても、最初のテーブルを作った瞬間にSQLiteが自動で生成してくれます。ファイル名なしで sqlite3 だけ叩くと、終了時に消えるインメモリの一時データベースが開きます。
sqlite3シェルから抜けるには?
.exit または .quit と入力してEnterを押せばOKです。どちらも動作は同じ。多くの環境では Ctrl+D(Windowsの場合は Ctrl+Z の後にEnter)でも終了できます。
SQLiteのドットコマンドとは何ですか?
.tables、.schema、.mode、.import のように . で始まるシェル組み込みコマンドのことです。これらはSQLではなくCLI自身への指示なので、末尾のセミコロンは不要で、sqlite3 シェルの中でしか使えません。
SQLite CLIでSQLファイルを実行するには?
シェル内からなら .read filename.sql を実行します。シェル外から流し込みたい場合は sqlite3 mydata.db < filename.sql のようにリダイレクトすればOK。どちらも開いているデータベースに対してファイル内のSQLを順番に実行します。