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

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 を使い始める前から存在していた
  • データ(本番環境など)を維持する必要があり、データベースをリセットできない

ベースライン化は、1つ以上のマイグレーションがすでに適用されていると Prisma Migrate に認識させることで、既存のテーブルやフィールドを作成しようとして生成されたマイグレーションが失敗するのを防ぎます。

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

  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 ファイル

さらに進む

© . All rights reserved.