prisma db pull→prisma migrate devに失敗する
Prismaとは
PrismaとはNode.jsのORマッパーの1つです。詳しい解説は他記事に譲りますが、下記2つの機能も持っています。
-
Introspection
npx prisma db pull
接続しているRDB上のスキーマを取得して、Prisma上のmodelファイルであるschema.prismaファイルにpullできます。 -
Prisma Migrate
npx prisma migrate dev
schema.prismaファイルの変更を接続しているRDB上のスキーマに反映できます。
prisma db pull→prisma migrate devに失敗
- 既存のMySQLデータをpullし、そのままprisma migrate devしようとすると失敗しました。
npx prisma init
npx prisma db pull
npx prisma migrate dev
原因
Prismaではmigrateの履歴とRDBスキーマの間で齟齬が発生する場合Driftエラーを起こし、DBのリセットが必要になってしまうようです。
今回も、Prismaを入れた後にRDB側でテーブル変更を行っており、それにより上記のエラーが発生したと考えられます。
schema.prismaファイルでmodelを運用する場合はRDB側でテーブルを触らない方が無難だと思います。
解決方法
mkdir -p prisma/migrations/init
npx prisma migrate diff \
--from-empty \
--to-schema-datamodel prisma/schema.prisma \
--script > prisma/migrations/init/migration.sql
npx prisma migrate resolve --applied init
npx prisma migrate dev
移行差分のファイルを形成し、そのファイルを元に"applied"にマークします。migrationの起点に定めているようです。
そのままmigrate devするとうまくmigrationに成功しました!
補足1 appliedデータの削除
npx prisma migrate resolve --applied init
で作成したappliedデータはschemaの_prisma_migrationsテーブル上にレコードとして残ります。
prisma migrate dev
がうまくいかないときはappliedデータを用いてmigrateしようとするので、過去のappliedデータを消したいときはレコード削除しましょう。
補足2 collationの変更
上記解決方法のmigrate diffでマイグレーションを出力したファイルを直接編集することでcollationを変更できます。
schema.prismaファイル上でcollationを設定することはできないようです。
補足3 PrismaではCHECK制約を利用できない
npx prisma db pull
時下記エラーが出ました。
Prismaでは現在(2024/4時点)、CHECK制約(check constraints)を利用できません。
この辺り、まだまだ手が届いていない部分もあるので開発が待たれますね。
References
Discussion
@nori_maki
の
prisma/migrations/init/migration/sql
の部分ですが、正しくはprisma/migrations/init/migration.sql
ではないでしょうか?@tomlla
あれ、そうですね、、、ありがとうございます!
修正しました🙇