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 を使い始める前から存在していた
- データ(本番環境など)を維持する必要があり、データベースをリセットできない
ベースライン化は、1つ以上のマイグレーションがすでに適用されていると Prisma Migrate に認識させることで、既存のテーブルやフィールドを作成しようとして生成されたマイグレーションが失敗するのを防ぎます。
ベースラインマイグレーションを作成するには
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
を使用して、本番環境での失敗したマイグレーションをデバッグして解決する方法については、本番環境トラブルシューティングガイドを参照してください。