SQLiteは軽量で扱いやすい一方、スキーマ変更(マイグレーション)が難しいDBです。 特に業務アプリでは、データを壊さず安全に更新する仕組みが必須になります。 この記事では、SQLiteでのスキーマ変更を安全に行うための実務向けマイグレーション戦略をまとめます。
この記事でわかること
・SQLiteのスキーマ変更が難しい理由
・ALTER TABLE の制限と回避策
・テーブル再作成パターン(公式推奨)
・EF Core Migrations の注意点
・バージョン管理と安全な更新手順
・業務アプリ向けベストプラクティス
・SQLiteのスキーマ変更が難しい理由
・ALTER TABLE の制限と回避策
・テーブル再作成パターン(公式推奨)
・EF Core Migrations の注意点
・バージョン管理と安全な更新手順
・業務アプリ向けベストプラクティス
1. SQLiteのスキーマ変更が難しい理由
SQLiteは他のRDBMSと違い、ALTER TABLE の機能が非常に限定的です。
■ できること
- 列の追加(ADD COLUMN)
- テーブル名の変更
- 列名の変更(SQLite 3.25+)
■ できないこと(重要)
- 列の削除
- 列の型変更
- NOT NULL の追加
- UNIQUE の追加
- 外部キー制約の追加
結論:
SQLiteで複雑なスキーマ変更をする場合、
テーブル再作成(リビルド)が基本戦略になります。
2. SQLite公式推奨:テーブル再作成パターン
SQLiteの公式ドキュメントでも、複雑な変更は 「新しいテーブルを作ってデータを移す」方法が推奨されています。
■ テーブル再作成の手順
BEGIN TRANSACTION;
-- 1. 新しいテーブルを作成
CREATE TABLE Users_new (
Id INTEGER PRIMARY KEY,
Name TEXT NOT NULL,
Age INTEGER,
Email TEXT -- 新しい列
);
-- 2. 旧テーブルからデータ移行
INSERT INTO Users_new (Id, Name, Age)
SELECT Id, Name, Age FROM Users;
-- 3. 旧テーブル削除
DROP TABLE Users;
-- 4. 新テーブルをリネーム
ALTER TABLE Users_new RENAME TO Users;
COMMIT;
■ メリット
- どんなスキーマ変更にも対応できる
- データを壊さず移行できる
- SQLite公式が推奨する安全な方法
3. EF Core Migrations を使う場合の注意点
EF Core の Migrations は便利ですが、 SQLiteでは一部の操作が自動生成されません。
■ 例:列削除は自動生成されない
migrationBuilder.DropColumn("OldColumn", "Users");
SQLiteではこの操作は実行できず、例外が発生します。
■ EF Core が自動生成するのは「テーブル再作成」
EF Core は SQLite の制限を理解しており、 必要に応じて新テーブル作成 → データ移行 → 旧テーブル削除を自動生成します。
■ ただし注意
- 大量データがあると時間がかかる
- 外部キー制約が複雑だと失敗することがある
- 手動でマイグレーションを調整する必要がある
4. スキーマ変更のバージョン管理
業務アプリでは、DBスキーマのバージョン管理が必須です。
■ バージョン管理テーブルを作る
CREATE TABLE SchemaVersion (
Version INTEGER NOT NULL
);
■ アプリ起動時にバージョンを確認
var version = db.SchemaVersion.First().Version;
if (version < 2)
{
// マイグレーション処理
}
■ マイグレーション後にバージョン更新
UPDATE SchemaVersion SET Version = 2;
これにより、アプリ起動時に自動でスキーマ更新が可能になります。
5. スキーマ変更の安全な手順(実務向け)
① バックアップを取る(必須)
SQLiteはファイルコピーだけでバックアップ可能。
② トランザクションで囲む
BEGIN TRANSACTION;
-- スキーマ変更
COMMIT;
③ 新テーブル作成 → データ移行 → 旧テーブル削除
④ 外部キー制約を一時的にOFFにする(必要な場合)
PRAGMA foreign_keys = OFF;
-- スキーマ変更
PRAGMA foreign_keys = ON;
⑤ バージョン番号を更新
⑥ アプリ側でキャッシュやモデルを更新
6. よくあるスキーマ変更と対応表
| やりたいこと | SQLiteでの方法 |
|---|---|
| 列を追加 | ALTER TABLE ADD COLUMN |
| 列を削除 | テーブル再作成 |
| 列の型変更 | テーブル再作成 |
| NOT NULL追加 | テーブル再作成 |
| UNIQUE追加 | テーブル再作成 |
| 外部キー追加 | テーブル再作成 |
| 複合インデックス追加 | CREATE INDEX |
7. 業務アプリ向けベストプラクティス
- SQLiteのALTER TABLEは信用しすぎない
- 複雑な変更はテーブル再作成が基本
- EF Core Migrationsは便利だが、生成内容を必ず確認
- スキーマバージョン管理テーブルを用意する
- マイグレーションはトランザクション+バックアップが必須
- 外部キー制約がある場合は順序に注意
まとめ:SQLiteのスキーマ変更は“慎重に・計画的に”
- ALTER TABLE の制限が多い → テーブル再作成が基本戦略
- EF Core Migrations は強力だが、SQLiteでは調整が必要
- バージョン管理と安全な更新手順が重要
SQLiteは軽量で扱いやすい反面、 スキーマ変更は他のDBより難しいという特徴があります。 この記事の戦略を使えば、データを壊さず安全にマイグレーションを行えます。