投稿日:2026/5/9
更新日:2026/5/9

既存の migration.sql を編集した場合、Prisma が記録しているチェックサムと実際のDBスキーマが乖離する。このスキルはその差分を解消する。
# developブランチからの変更を確認
git diff develop --name-only -- 'prisma/migrations/**/*.sql'
変更がなければ終了。変更があれば各ファイルについて Step 2 以降を実行。
git diff develop -- <migration_sql_path>
+ で始まる行(+++ ヘッダーを除く)が追加されたSQL。
これが「DBに未適用の変更」となる。
# macOSの場合
shasum -a 256 <migration_sql_path> | awk '{print $1}'
# メインDB(マイグレーションユーザー)
cd backend && npx dotenv -e .env.local -e .env -- bash -c 'echo $MIGRATION_DATABASE_URL'
# テストDB(マイグレーションユーザー)
cd backend && npx dotenv -e .env.test -- bash -c 'echo $MIGRATION_DATABASE_URL'
.env.local が存在しない場合は .env のみ使用。
git diff から追加されたSQL行を抽出し、両DBに実行する。
# 追加されたSQL(+ 行のみ、ヘッダー除外)を確認
git diff develop -- <migration_sql_path> | grep '^+' | grep -v '^+++' | sed 's/^+//'
DDLを特定したら psql で適用:
# メインDB
psql "<MAIN_MIGRATION_DATABASE_URL>" -c "<追加されたDDL文>"
# テストDB
psql "<TEST_MIGRATION_DATABASE_URL>" -c "<追加されたDDL文>"
注意: ALTER TABLE など冪等でないDDLは IF NOT EXISTS / IF EXISTS を付けて実行する。
例: ALTER TABLE certification.tags ADD COLUMN IF NOT EXISTS "order" INTEGER NOT NULL DEFAULT 0;
テーブル名はスキーマ修飾(certification.<table>)で指定する。
migration_name はディレクトリ名(例: 20260503093857_add_tag_models)。
# メインDB
psql "<MAIN_MIGRATION_DATABASE_URL>" \
-c "UPDATE certification.\"_prisma_migrations\" SET checksum = '<new_checksum>' WHERE migration_name = '<migration_name>';"
# テストDB
psql "<TEST_MIGRATION_DATABASE_URL>" \
-c "UPDATE certification.\"_prisma_migrations\" SET checksum = '<new_checksum>' WHERE migration_name = '<migration_name>';"
# Prismaがチェックサムエラーを出さないか確認(メインDB)
cd backend && npx prisma migrate deploy
# テストDB
cd backend && npx dotenv -e .env.test -- npx prisma migrate deploy
どちらも No pending migrations to apply. と表示されれば成功。
pnpm -F backend test:coverage
MIGRATION_DATABASE_URL(adminユーザー)を使うこと。 DATABASE_URL(appユーザー)はDDL権限がなく ERROR: must be owner of table になる。psql -c で実行する。.env.local が存在する場合は .env より優先される(npx dotenv -e .env.local -e .env の順)。