メインコンテンツにスキップ

Prisma Migrate入門

このページでは、Prisma Migrateを使用して開発環境でスキーマの移行を開始する方法について説明します。

Prisma Migrateをゼロから始める

開発環境でPrisma Migrateを始めるには

  1. Prismaスキーマを作成する

    schema.prisma
    datasource 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])
    }
    ヒント

    スキーマでネイティブ型マッピング属性を使用して、作成する正確なデータベース型を決定できます(たとえば、Stringvarchar(100)またはtextにマッピングできます)。

    1. 最初のマイグレーションを作成する
    prisma migrate dev --name init
    表示CLI結果

    Prismaスキーマがデータベーススキーマと同期され、マイグレーション履歴が初期化されました

    migrations/
    └─ 20210313140442_init/
    └─ migration.sql
  2. スキーマにフィールドを追加する

    model User {
    id Int @id @default(autoincrement())
    jobTitle String
    name String
    posts Post[]
    }
  3. 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を追加する手順は次のとおりです

  1. データベースをイントロスペクトしてPrismaスキーマを更新する
  2. ベースラインマイグレーションを作成する
  3. Prisma Schema Languageでサポートされていない機能を回避するためにスキーマまたはマイグレーションを更新する
  4. ベースラインマイグレーションを適用する
  5. マイグレーション履歴とPrismaスキーマをコミットする

イントロスペクトしてPrismaスキーマを作成または更新する

Prismaスキーマがデータベーススキーマと同期していることを確認してください。以前のバージョンのPrisma Migrateを使用している場合は、すでに真であるはずです。

  1. データベースをイントロスペクトして、Prismaスキーマが最新であることを確認する
    prisma db pull

ベースラインマイグレーションを作成する

ベースライニングとは、次のデータベースのマイグレーション履歴を初期化するプロセスです。

  • Prisma Migrateの使用を開始する前に存在していた
  • (本番環境のように)維持する必要があるデータが含まれているため、データベースをリセットできない

ベースライニングは、Prisma Migrateに、1つ以上のマイグレーションがすでに適用されていると想定するように指示します。これにより、生成されたマイグレーションが、すでに存在するテーブルとフィールドを作成しようとしたときに失敗するのを防ぎます。

ベースラインマイグレーションを作成するには

  1. prisma/migrationsフォルダーがある場合は、このフォルダーを削除、移動、名前変更、またはアーカイブします。
  2. 次のコマンドを実行して、優先する名前でmigrationsディレクトリを内部に作成します。この例では、マイグレーション名に0_initを使用します
    mkdir -p prisma/migrations/0_init

    0_が重要なのは、Prisma Migrateが辞書式順序でマイグレーションを適用するためです。現在のタイムスタンプなど、別の値を使用できます。

  3. prisma migrate diffを使用してマイグレーションを生成し、ファイルに保存します
    npx prisma migrate diff \
    --from-empty \
    --to-schema-datamodel prisma/schema.prisma \
    --script > prisma/migrations/0_init/migration.sql
  4. 生成されたマイグレーションを確認します。

Prisma Schema Languageでサポートされていない機能を回避する

データベースにすでに存在するサポートされていないデータベース機能を含めるには、最初のマイグレーションSQLを置き換えるか、変更する必要があります

  1. ベースラインマイグレーションを作成するセクションで生成されたmigration.sqlファイルを開きます。
  2. 生成されたSQLを変更します。例:
  • 変更がわずかな場合は、生成されたマイグレーションに追加のカスタムSQLを追加できます。次の例では、部分インデックスを作成します
    /* Generated migration SQL */

    CREATE UNIQUE INDEX tests_success_constraint ON posts (subject, target)
    WHERE success;
  • 変更が重要な場合は、マイグレーションファイル全体をデータベースダンプの結果(mysqldumppg_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エラーが発生しないようにします

最初のマイグレーションを適用する

最初のマイグレーションを適用するには

  1. データベースに対して次のコマンドを実行します

    npx prisma migrate resolve --applied 0_init
  2. データベーススキーマを確認して、マイグレーションが目的のエンドステートにつながることを確認します(たとえば、スキーマを本番データベースと比較するなど)。

新しいマイグレーション履歴とデータベーススキーマは、Prismaスキーマと同期しているはずです。

マイグレーション履歴とPrismaスキーマをコミットする

次のものをソース管理にコミットします

  • マイグレーション履歴フォルダー全体
  • schema.prismaファイル

さらに進む