🧊

prisma db pull→prisma migrate devに失敗する

2024/04/17に公開
2

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上のスキーマに反映できます。

image.png

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

https://www.prisma.io/docs/

https://github.com/prisma/prisma/issues/11555

https://github.com/prisma/prisma/issues/12845

https://github.com/prisma/prisma/issues/3388

https://qiita.com/sumikei11/items/35491a43ac6e4d6ea5ca

Discussion

tomllatomlla

@nori_maki

npx prisma migrate diff \
--from-empty \
--to-schema-datamodel prisma/schema.prisma \
--script > prisma/migrations/init/migration/sql


prisma/migrations/init/migration/sql の部分ですが、正しくは
prisma/migrations/init/migration.sql ではないでしょうか?

のりまきのりまき

@tomlla
あれ、そうですね、、、ありがとうございます!
修正しました🙇