0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Last updated at Posted at 2024-04-17

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しようとすると失敗しました。

実行環境
Prisma 5.11.0
MySQL 8.0
OS: Alpine
node 18

npx prisma init

npx prisma db pull

npx prisma migrate dev

Drift detected: Your database schema is not in sync with your migration history.

The following is a summary of the differences between the expected database schema given your migrations files, and the actual schema of the database.

...

We need to reset the MySQL database {database_name} at "localhost:3306"
Do you want to continue? All data will be lost.

原因

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)を利用できません。

These constraints are not supported by Prisma Client, because Prisma currently does not fully support check constraints. Read more: https://pris.ly/d/check-constraints

- Model: {table_name1}, constraint: {constaraint_name1}
- Model: {table_name2}, constraint: {constaraint_name2}
...

この辺り、まだまだ手が届いていない部分もあるので開発が待たれますね。

References

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?