Drizzle ORMでの型安全なスキーマ定義とマイグレーション手順

Drizzle TypeScript Database Node.js
結論

ローカル試作は drizzle-kit push、本番運用は generatemigrate で管理します。

// 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 generatemigrate
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 されて貴重なデータが永久消失する重大事故 が発生します。


本番開発での安全な運用手順

  1. schema.ts で型定義を追加・変更する
  2. npx drizzle-kit generate を実行し、drizzle/ ディレクトリ内に生成された .sql ファイルの中身を人間の目で確認する
  3. 問題がなければ .sql ファイルを Git にコミットする
  4. 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"
  }
}