Prisma Migrate入門
このページでは、Prisma Migrateを使用して開発環境でスキーマの移行を開始する方法について説明します。
Prisma Migrateをゼロから始める
開発環境でPrisma Migrateを始めるには
-
Prismaスキーマを作成する
schema.prismadatasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
model User {
id Int @id @default(autoincrement())
name String
posts Post[]
}
model Post {
id Int @id @default(autoincrement())
title String
published Boolean @default(true)
authorId Int
author User @relation(fields: [authorId], references: [id])
}ヒントスキーマでネイティブ型マッピング属性を使用して、作成する正確なデータベース型を決定できます(たとえば、
String
はvarchar(100)
またはtext
にマッピングできます)。- 最初のマイグレーションを作成する
prisma migrate dev --name init
表示CLI結果Prismaスキーマがデータベーススキーマと同期され、マイグレーション履歴が初期化されました
migrations/
└─ 20210313140442_init/
└─ migration.sql -
スキーマにフィールドを追加する
model User {
id Int @id @default(autoincrement())
jobTitle String
name String
posts Post[]
} -
2回目のマイグレーションを作成する
prisma migrate dev --name added_job_title
表示CLI結果Prismaスキーマが再びデータベーススキーマと同期され、マイグレーション履歴に2つのマイグレーションが含まれています
migrations/
└─ 20210313140442_init/
└─ migration.sql
└─ 20210313140442_added_job_title/
└─ migration.sql
これで、ソース管理し、テスト環境と本番環境への変更のデプロイに使用できるマイグレーション履歴ができました。
既存のプロジェクトにPrisma Migrateを追加する
既存のプロジェクトにPrisma Migrateを追加する手順は次のとおりです
- データベースをイントロスペクトしてPrismaスキーマを更新する
- ベースラインマイグレーションを作成する
- Prisma Schema Languageでサポートされていない機能を回避するためにスキーマまたはマイグレーションを更新する
- ベースラインマイグレーションを適用する
- マイグレーション履歴とPrismaスキーマをコミットする
イントロスペクトしてPrismaスキーマを作成または更新する
Prismaスキーマがデータベーススキーマと同期していることを確認してください。以前のバージョンのPrisma Migrateを使用している場合は、すでに真であるはずです。
- データベースをイントロスペクトして、Prismaスキーマが最新であることを確認する
prisma db pull
ベースラインマイグレーションを作成する
ベースライニングとは、次のデータベースのマイグレーション履歴を初期化するプロセスです。
- Prisma Migrateの使用を開始する前に存在していた
- (本番環境のように)維持する必要があるデータが含まれているため、データベースをリセットできない
ベースライニングは、Prisma Migrateに、1つ以上のマイグレーションがすでに適用されていると想定するように指示します。これにより、生成されたマイグレーションが、すでに存在するテーブルとフィールドを作成しようとしたときに失敗するのを防ぎます。
ベースラインマイグレーションを作成するには
prisma/migrations
フォルダーがある場合は、このフォルダーを削除、移動、名前変更、またはアーカイブします。- 次のコマンドを実行して、優先する名前で
migrations
ディレクトリを内部に作成します。この例では、マイグレーション名に0_init
を使用しますmkdir -p prisma/migrations/0_init
注0_
が重要なのは、Prisma Migrateが辞書式順序でマイグレーションを適用するためです。現在のタイムスタンプなど、別の値を使用できます。 prisma migrate diff
を使用してマイグレーションを生成し、ファイルに保存しますnpx prisma migrate diff \
--from-empty \
--to-schema-datamodel prisma/schema.prisma \
--script > prisma/migrations/0_init/migration.sql- 生成されたマイグレーションを確認します。
Prisma Schema Languageでサポートされていない機能を回避する
データベースにすでに存在するサポートされていないデータベース機能を含めるには、最初のマイグレーションSQLを置き換えるか、変更する必要があります
- ベースラインマイグレーションを作成するセクションで生成された
migration.sql
ファイルを開きます。 - 生成されたSQLを変更します。例:
- 変更がわずかな場合は、生成されたマイグレーションに追加のカスタムSQLを追加できます。次の例では、部分インデックスを作成します
/* Generated migration SQL */
CREATE UNIQUE INDEX tests_success_constraint ON posts (subject, target)
WHERE success; - 変更が重要な場合は、マイグレーションファイル全体をデータベースダンプの結果(
mysqldump
、pg_dump
)に置き換える方が簡単な場合があります。pg_dump
をこれに使用する場合、次のコマンドを使用してsearch_path
を更新する必要があります:SELECT pg_catalog.set_config('search_path', '', false);
; そうしないと、次のエラーが発生します:The underlying table for model '_prisma_migrations' does not exist.
`情報外部キーは同じステップで作成されるため、テーブルの順序はすべてを一度に作成する場合に重要であることに注意してください。したがって、それらを並べ替えるか、すべてのテーブルが作成された後で制約の作成を最後のステップに移動して、
can't create constraint
エラーが発生しないようにします
最初のマイグレーションを適用する
最初のマイグレーションを適用するには
-
データベースに対して次のコマンドを実行します
npx prisma migrate resolve --applied 0_init
-
データベーススキーマを確認して、マイグレーションが目的のエンドステートにつながることを確認します(たとえば、スキーマを本番データベースと比較するなど)。
新しいマイグレーション履歴とデータベーススキーマは、Prismaスキーマと同期しているはずです。
マイグレーション履歴とPrismaスキーマをコミットする
次のものをソース管理にコミットします
- マイグレーション履歴フォルダー全体
schema.prisma
ファイル
さらに進む
- 本番環境へのマイグレーションのデプロイの詳細については、Prisma Migrateを使用したデータベース変更のデプロイガイドを参照してください。
prisma migrate diff
、prisma db execute
、および/またはprisma migrate resolve
を使用して、本番環境で失敗したマイグレーションをデバッグして解決する方法については、本番環境のトラブルシューティングガイドを参照してください。