SQLiteチートシート:ログインからスキーマ確認・DMLまとめ

スポンサーリンク

SQLiteチートシート:ログインからスキーマ確認・DMLまとめ

はじめに

SQLiteはRailsの開発環境でデフォルトのデータベースとして使われます。sqlite3 コマンドを使うとDBに直接ログインしてテーブル構造の確認やデータの操作ができます。

この記事ではログインから、スキーマ・テーブル定義の確認、よく使うSQLまでまとめます。


ログイン

sqlite3 path/to/database.db

Railsプロジェクトでは開発用DBが db/development.sqlite3 にあります。

sqlite3 db/development.sqlite3

接続すると sqlite> プロンプトが表示されます。

SQLite version 3.43.0
Enter ".help" for usage hints.
sqlite>

オプション

sqlite3 db/development.sqlite3 "SELECT * FROM users LIMIT 5;"   # コマンド実行して終了
sqlite3 -header -column db/development.sqlite3                   # ヘッダーと整形表示で起動

メタコマンド(ドットコマンド)

SQLiteのメタコマンドは . から始まります。SQLの終端 ; は不要です。

コマンド 説明
.help コマンド一覧を表示
.quit / .exit 終了
.databases 接続中のデータベースを表示
.tables テーブル一覧を表示
.tables パターン 名前が一致するテーブルを絞り込む
.schema 全テーブルのCREATE文を表示
.schema テーブル名 指定テーブルのCREATE文を表示
.indexes テーブル名 インデックス一覧を表示
.headers on/off ヘッダー行の表示切替
.mode column カラム整形表示
.mode table テーブル形式で表示(見やすい)
.mode csv CSV形式で表示
.width 自動調整 カラム幅を自動調整
.output ファイル名 出力先をファイルに変更
.output stdout 出力先をターミナルに戻す
.read ファイル名 SQLファイルを読み込んで実行

表示を見やすくする

sqlite> .headers on
sqlite> .mode table
sqlite> SELECT * FROM users LIMIT 3;
+----+----------+---------------------------+
| id |   name   |           email           |
+----+----------+---------------------------+
| 1  | 田中太郎 | tanaka@example.com        |
| 2  | 鈴木花子 | suzuki@example.com        |
+----+----------+---------------------------+

スキーマ・テーブル定義の確認

テーブル一覧

sqlite> .tables
ar_internal_metadata  schema_migrations  users

テーブルのCREATE文を確認

sqlite> .schema users
CREATE TABLE IF NOT EXISTS "users" (
  "id" integer NOT NULL PRIMARY KEY,
  "name" varchar NOT NULL,
  "email" varchar NOT NULL,
  "created_at" datetime(6) NOT NULL,
  "updated_at" datetime(6) NOT NULL
);

カラム定義の詳細(PRAGMA)

PRAGMA table_info(users);
cid  name        type         notnull  dflt_value  pk
---  ----------  -----------  -------  ----------  --
0    id          integer      1                    1
1    name        varchar      1                    0
2    email       varchar      1                    0
3    created_at  datetime(6)  1                    0
4    updated_at  datetime(6)  1                    0
  • cid — カラムインデックス
  • notnull — NOT NULL制約(1: あり)
  • dflt_value — デフォルト値
  • pk — 主キー(1: あり)

インデックスの確認

PRAGMA index_list(users);
PRAGMA index_info(index_users_on_email);

外部キーの確認

PRAGMA foreign_key_list(posts);

基本的なSQL

SELECT

-- 全件取得
SELECT * FROM users;

-- カラムを絞る
SELECT id, name, email FROM users;

-- 条件で絞り込む
SELECT * FROM users WHERE name = '田中太郎';

-- 複数条件
SELECT * FROM users WHERE created_at > '2026-01-01' AND name LIKE '田中%';

-- 件数を限定
SELECT * FROM users LIMIT 10;
SELECT * FROM users LIMIT 10 OFFSET 20;

-- 並び替え
SELECT * FROM users ORDER BY created_at DESC;
SELECT * FROM users ORDER BY name ASC, created_at DESC;

-- 集計
SELECT COUNT(*) FROM users;
SELECT COUNT(*) FROM users WHERE name IS NOT NULL;

JOIN

-- INNER JOIN
SELECT users.name, posts.title
FROM users
INNER JOIN posts ON posts.user_id = users.id;

-- LEFT JOIN(userがいなくてもpostsを取得)
SELECT posts.title, users.name
FROM posts
LEFT JOIN users ON users.id = posts.user_id;

INSERT

INSERT INTO users (name, email, created_at, updated_at)
VALUES ('田中太郎', 'tanaka@example.com', datetime('now'), datetime('now'));

UPDATE

UPDATE users SET name = '田中次郎' WHERE id = 1;
UPDATE users SET updated_at = datetime('now') WHERE email LIKE '%@example.com';

DELETE

DELETE FROM users WHERE id = 1;
DELETE FROM users WHERE created_at < '2025-01-01';

-- 全件削除(件数を返す)
DELETE FROM users;

SQLite特有の機能・注意点

日時関数

SELECT datetime('now');               -- UTC現在時刻
SELECT datetime('now', 'localtime');  -- ローカル時刻
SELECT date('now', '-7 days');        -- 7日前
SELECT strftime('%Y-%m', created_at) FROM users;  -- 年月で集計

型の柔軟性

SQLiteは型チェックが緩く、varchar カラムに数値を入れても動きます。これはRailsのマイグレーションで定義した型と実際の格納値が異なる可能性を意味します。

-- varchar カラムでも数値で比較できてしまう(意図しない動作に注意)
SELECT * FROM users WHERE id = '1';   -- 動く
SELECT * FROM users WHERE id = 1;    -- こちらを使う

AUTOINCREMENT と rowid

SQLiteはすべてのテーブルに内部的に rowid を持ちます。INTEGER PRIMARY KEYrowid の別名になります。

SELECT rowid, * FROM users;
SELECT last_insert_rowid();   -- 最後にINSERTしたrowid

ファイルサイズの確認

sqlite> .dbinfo
database page size:  4096
number of pages:     5
...

Railsでよく使うパターン

Railsの開発環境でDBの中身を直接確認したいときに使います。

# Railsコンソール経由が基本だが、直接確認したいとき
sqlite3 db/development.sqlite3

# テスト用DBを確認
sqlite3 db/test.sqlite3
sqlite> .headers on
sqlite> .mode table
sqlite> SELECT * FROM schema_migrations ORDER BY version DESC LIMIT 5;

schema_migrations テーブルにはRailsのマイグレーション実行履歴が記録されています。


まとめ

操作 コマンド
ログイン sqlite3 db/development.sqlite3
テーブル一覧 .tables
テーブル定義 .schema テーブル名
カラム詳細 PRAGMA table_info(テーブル名)
表示を整形 .headers on + .mode table
終了 .quit

RailsのDBマイグレーション操作は「Rails のDB操作コマンド入門:db:create から db:rollback まで」を参照してください。

MySQLでの同様の操作は「MySQLチートシート:ログインからスキーマ確認・DMLまとめ」を参照してください。

PostgreSQLでの同様の操作は「PostgreSQLチートシート:ログインからスキーマ確認・DMLまとめ」を参照してください。

Active RecordからSQLがどう発行されるかは「Active Record入門:検索・更新・リレーションの基本まとめ」を参照してください。