Drizzle ORMでの型安全なスキーマ定義とマイグレーション手順
Drizzle TypeScript Database Node.js
結論
ローカル試作は drizzle-kit push、本番運用は generate + migrate で管理します。
// Drizzle ORM公式仕様:schema.ts での型安全なテーブル定義
import { pgTable, serial, text, timestamp } from 'drizzle-orm/pg-core';
export const users = pgTable('users', {
id: serial('id').primaryKey(),
email: text('email').notNull().unique(),
createdAt: timestamp('created_at').defaultNow().notNull(),
});
Drizzle ORM公式仕様:2つのマイグレーション手法の比較
| 評価項目 | drizzle-kit push (直接同期) | drizzle-kit generate + migrate |
|---|---|---|
| SQLファイルの生成 | ❌ 生成されない(DBへ直接反映) | ◯ drizzle/0000_...sql ファイルを生成 |
| Gitによるバージョン管理 | ❌ 変更履歴が残らない | ◯ SQLがGitで管理可能(事前レビュー可) |
| 安全度・ロールバック | ❌ 不可(データ喪失リスクあり) | ◯ SQLを手動監査・安全に実行可能 |
| 推奨ユースケース | 個人・ローカルでの高速プロトタイピング | 本番環境・CI/CD・チーム開発 |
実際に起こる事故:本番DBに対する drizzle-kit push によるデータ喪失
drizzle-kit push は、ローカル開発の速度向上を目的に「現在のTypeScriptスキーマと実DBの差分を直接適用する」コマンドです。
これを本番データベースに対して実行すると、カラム名の変更(Rename)時に Drizzle が「旧カラムの削除+新カラムの作成」と判断し、事前確認のSQLもないまま本番カラムが DROP COLUMN されて貴重なデータが永久消失する重大事故 が発生します。
本番開発での安全な運用手順
schema.tsで型定義を追加・変更するnpx drizzle-kit generateを実行し、drizzle/ディレクトリ内に生成された.sqlファイルの中身を人間の目で確認する- 問題がなければ
.sqlファイルを Git にコミットする - CI/CD または本番デプロイ時に
npx drizzle-kit migrateを呼び出して安全にDB変更を適用する
// package.json の運用スクリプト定義例
{
"scripts": {
"db:push": "drizzle-kit push",
"db:generate": "drizzle-kit generate",
"db:migrate": "drizzle-kit migrate"
}
}