sqlite3コマンドの使い方 — .tables・.schema・.mode・.importを覚える
この章の目次開く
SQLiteには sqlite3 という公式のコマンドラインツールが付属しています。データベースを作る、中身を覗く、CSVを取り込む、バックアップを取るといった作業は、すべてこのコマンド1つで完結します。
GUIツールを入れる前に、まず sqlite3 を使えるようにしておくと、サーバー上での調査やCIでの前処理がぐっと楽になります。
学習者データベースを作るコマンドって、CREATE DATABASE みたいなものを叩くんですか?
先生SQLiteには CREATE DATABASE がないんだ。ファイル名を指定して開くと、その時点でデータベースができる。
インストールを確認する
macOSには最初から入っています。Linuxではディストリビューションのパッケージで入ります。
sqlite3 --version3.50.4 2025-07-30 19:33:53 ...
バージョンが表示されれば準備完了です。入っていない場合は次のようにインストールします。
# Debian / Ubuntu
sudo apt install sqlite3
# macOS(Homebrewで新しいバージョンを入れたい場合)
brew install sqliteデータベースを開く・作る
ファイル名を渡して起動します。ファイルが存在しなければ、その名前で新しいデータベースが作られます。
sqlite3 mydb.dbSQLite version 3.50.4 2025-07-30 19:33:53
Enter ".help" for usage hints.
sqlite>
CREATE DATABASE がありません。ファイルを開くことが、そのままデータベースの作成にあたります。
ただし、この時点ではまだファイルはディスクに作られていません。最初のテーブルを作った時点でファイルが書き出されます。
引数なしで起動すると、一時的なデータベースが使われます。メモリ上だけで完結させたい場合は :memory: を指定します。
sqlite3 :memory:終了するときは .quit です。Ctrl+D でも抜けられます。
ドットコマンドとSQLの違い
sqlite3 の中では、2種類の命令を打てます。
| 種類 | 例 | 末尾のセミコロン |
|---|---|---|
| SQL | SELECT * FROM users; | 必要 |
| ドットコマンド | .tables | 不要 |
ドットコマンドは sqlite3 ツール自身への指示で、SQLではありません。行の先頭にドットを書く必要があり、セミコロンは付けません。
よく使うものを先に押さえておきましょう。
| コマンド | 説明 |
|---|---|
.help | ドットコマンドの一覧を表示 |
.databases | 開いているデータベースとファイルパスを表示 |
.tables | テーブル名の一覧を表示 |
.schema | すべてのテーブルの CREATE 文を表示 |
.schema テーブル名 | 特定テーブルの CREATE 文を表示 |
.indexes | インデックスの一覧を表示 |
.mode 形式 | 結果の表示形式を切り替える |
.headers on | 結果に列名の見出しを付ける |
.import ファイル テーブル | ファイルをテーブルに取り込む |
.output ファイル | 以降の出力をファイルに書き出す |
.read ファイル | ファイルに書いたSQLを実行する |
.backup ファイル | データベースを安全にバックアップする |
.quit | 終了する |
スキーマを確認する
調査で最初にやるのは、どんなテーブルがあるかの確認です。
sqlite> .tables
books reviews users
テーブルの定義を見たいときは .schema を使います。
sqlite> .schema users
CREATE TABLE users(
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
email TEXT UNIQUE,
created_at TEXT DEFAULT (datetime('now'))
);
.schema は「実際に作られた定義」を返すため、マイグレーションファイルより信頼できます。
同じ情報は sqlite_schema テーブルからSQLでも取れます。スクリプトの中で使うならこちらが便利です。
SELECT name, type FROM sqlite_schema WHERE type = 'table';
結果の表示を読みやすくする
デフォルトの表示は、値がパイプ区切りで並ぶだけで非常に読みにくいものです。
sqlite> SELECT * FROM users;
1|田中|tanaka@example.com|2026-08-01 10:00:00
2|佐藤|sato@example.com|2026-08-02 11:30:00
.mode で表示形式を変えられます。
構文: .mode 形式名
| 形式 | 説明 |
|---|---|
box | 罫線で囲んだ表。画面で読むならこれ |
table | ASCII文字の表 |
column | 列を揃えて表示 |
csv | CSV形式。ファイル出力向け |
json | JSON配列。プログラムに渡すとき便利 |
markdown | Markdownの表。ドキュメントに貼るとき便利 |
list | パイプ区切り(デフォルト) |
.headers on と組み合わせるのが定番です。
sqlite> .mode box
sqlite> .headers on
sqlite> SELECT * FROM users;
┌────┬──────┬────────────────────┬─────────────────────┐
│ id │ name │ email │ created_at │
├────┼──────┼────────────────────┼─────────────────────┤
│ 1 │ 田中 │ tanaka@example.com │ 2026-08-01 10:00:00 │
│ 2 │ 佐藤 │ sato@example.com │ 2026-08-02 11:30:00 │
└────┴──────┴────────────────────┴─────────────────────┘
学習者毎回この2行を打つのは面倒です……。
ホームディレクトリに .sqliterc というファイルを置くと、起動時に自動で読み込まれます。
.mode box
.headers on
CSVを取り込む
調査や初期データ投入でよく使うのが .import です。
構文: .import ファイルパス テーブル名
| 引数 | 説明 |
|---|---|
| ファイルパス | 取り込む元ファイル。.mode で指定した形式として解釈される |
| テーブル名 | 取り込み先のテーブル。存在しない場合は自動で作られる |
主なオプションは次の通りです。
| オプション | 説明 |
|---|---|
--csv | ファイルをCSVとして読む |
--skip N | 先頭N行を読み飛ばす |
--schema 名 | 取り込み先のスキーマを指定する |
sqlite> .import --csv books.csv books
意図した型で入れたい場合は、先に CREATE TABLE でテーブルを作り、その上で --skip 1 を付けてヘッダー行を飛ばします。
CREATE TABLE books (
id INTEGER PRIMARY KEY,
title TEXT NOT NULL,
price INTEGER
);sqlite> .import --csv --skip 1 books.csv books
逆に書き出したいときは .output と組み合わせます。
sqlite> .headers on
sqlite> .mode csv
sqlite> .output books_export.csv
sqlite> SELECT * FROM books;
sqlite> .output stdout
シェルから直接実行する
対話モードに入らず、シェルから1行で実行することもできます。CIやスクリプトではこちらを使います。
sqlite3 mydb.db "SELECT count(*) FROM users;"# JSONで受け取ってjqに渡す
sqlite3 -json mydb.db "SELECT id, name FROM users LIMIT 3;" | jq .SQLをファイルにまとめておいて流し込むこともできます。
sqlite3 mydb.db < schema.sql対話モードの中からファイルを読むなら .read です。
sqlite> .read schema.sql

よくあるハマりどころ
ファイルが作られない
sqlite3 mydb.db を実行して .quit しただけでは、ファイルはできません。テーブルを1つ作るまで、SQLiteはディスクに書き込まないためです。
sqlite> CREATE TABLE t(x);
sqlite> .quit
これでファイルが作られます。
別のディレクトリで実行して「データが消えた」
sqlite3 mydb.db はカレントディレクトリからの相対パスで解釈されます。別のディレクトリで同じコマンドを打つと、そこに空のデータベースが新規作成されます。「データが消えた」と思ったら、まず .databases で実際に開いているファイルのパスを確認してください。
sqlite> .databases
main: /Users/you/project/mydb.db r/w
先生「消えた」の9割はこれ。SQLiteは存在しないファイル名を渡されると、黙って新しく作るからね。
実行中のアプリのDBを cp でバックアップした
アプリが動いている最中に cp mydb.db backup.db とすると、書き込みの途中の状態をコピーしてしまい、壊れたファイルになることがあります。sqlite3 にはこのための専用コマンドがあります。
sqlite> .backup backup.db
詳しくは SQLiteの運用 で扱います。
ちゃんと使うためのポイント
sqlite3 ファイル名で開く。ファイルがなければ新規作成される- ドットコマンドはセミコロン不要、SQLはセミコロン必須
- 調査は
.tables→.schema テーブル名の順が基本 .mode boxと.headers onを.sqlitercに書いておくと毎回読みやすい- スクリプトでは
.sqlitercを無効化し、-jsonや-csvで形式を明示する - 稼働中のDBのバックアップに
cpを使わず.backupを使う
次の章では、SQLiteでもっとも誤解されやすい「型の緩さ」を扱います。VARCHAR(10) に11文字を入れても通ってしまう理由と、それを防ぐ STRICT テーブルを見ていきます。