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

マイグレーションのスカッシュ

このガイドでは、複数のマイグレーションファイルを単一のマイグレーションにスカッシュする方法を説明します。

マイグレーションのスカッシュについて

マイグレーションファイルの一部またはすべてを単一のマイグレーションにスカッシュすると便利な場合があります。このガイドでは、これを行うべき2つのシナリオを説明します。

どちらのケースでも、Prisma Migrateはmigrate diffコマンドを使用して2つのデータベーススキーマを比較し、一方からもう一方へ移行するための単一のSQLファイルを出力することで、これを行うツールを提供します。このガイドの残りの部分では、これら2つのシナリオで実行する方法を詳細に説明します。

開発環境からクリーンに移行する

マイグレーションのスカッシュは、ブランチベースのワークフローで開発する際に役立ちます。機能ブランチでの大規模なローカル開発中に、migrate devを使用して複数のマイグレーションを生成することがあります。機能が完成した後、マイグレーション履歴には、mainブランチにプッシュされる最終的なマイグレーション履歴には不要な中間ステップが含まれる場合があります。

本番環境で中間ステップを適用することを避けるべき重要な理由があるかもしれません(データが失われたり、極端に遅くなったり、中断を引き起こしたりする可能性があります)。そうでない場合でも、本番環境のマイグレーション履歴の煩雑さを避けたいと思うかもしれません。

migrate devを使用してこれを達成するための詳細な手順については、「開発環境からクリーンに移行する方法」のセクションを参照してください。

本番環境でクリーンな履歴を作成する

マイグレーションのスカッシュは、本番環境で全てのマイグレーションファイルを1つにスカッシュするためにも使用できます。これは、本番環境に長いマイグレーション履歴が蓄積され、中間ステップに余分な時間が必要となるため、新しい環境でそれを再現することが負担になっている場合に役立ちます。チームがマイグレーションステップから価値を得ていない(そして、いざとなればバージョン管理履歴からそれらを取り戻せる)ため、履歴全体を単一のマイグレーションにスカッシュすることが決定されます。

migrate diffmigrate resolveを使用してこれを達成するための詳細な手順については、「本番環境でクリーンな履歴を作成する方法」のセクションを参照してください。

マイグレーションをスカッシュする際の考慮事項

警告

マイグレーションをスカッシュする際、migration.sqlファイル内で手動で変更または追加されたSQLは保持されないことに注意してください。ビューやトリガーなどのカスタム追加を含むマイグレーションファイルがある場合は、マイグレーションがスカッシュされた後にそれらを再追加するようにしてください。

マイグレーションをスカッシュする方法

このセクションでは、上記で議論した2つのシナリオでマイグレーションをスカッシュする方法について、ステップバイステップの手順を説明します。

開発環境からクリーンに移行する方法

マイグレーションをスカッシュする前に、以下の開始条件を満たしていることを確認してください。

  • スカッシュするマイグレーションの内容は、まだ本番データベースに適用されていません。
  • 本番環境に適用されたすべてのマイグレーションは、既にローカルのマイグレーション履歴の一部です。
  • ブランチに追加した新しいマイグレーションファイルのいずれにも、カスタムSQLが含まれていません。
情報

機能ブランチを作成した後、本番データベースのマイグレーション履歴が分岐している場合、まず本番環境からのマイグレーション履歴とデータモデルの変更をローカル履歴にマージする必要があります。

次に、以下の手順に従ってください。

  1. ローカルの./prisma/migrationsフォルダの内容をmainブランチのマイグレーション履歴に一致するようにリセットします。

  2. 新しいマイグレーションを作成します。

    npx prisma migrate dev --name squashed_migrations

    これにより、以下の状態にする単一のマイグレーションが作成されます。

    • リセットされたマイグレーション履歴に記述されているmainブランチの状態から
    • ./prisma/schema.prismaファイルに記述されているローカル機能の状態へ
    • そして、これをsquashed_migrationsで終わる新しいディレクトリ内の新しいmigration.sqlファイルに出力します(--nameフラグで指定)。

この単一のマイグレーションファイルは、migrate deployを使用して本番環境に適用できるようになります。

本番環境でクリーンな履歴を作成する方法

マイグレーションをスカッシュする前に、以下の開始条件を満たしていることを確認してください。

  • マイグレーション履歴内のすべてのマイグレーションが本番データベースに適用されています。
  • データモデルがマイグレーション履歴と一致しています。
  • データモデルとマイグレーション履歴が同期しています。

次に、これらの手順に従ってください。これは、mainブランチ上で行うか、または他の変更が加えられる前にmainにマージされる新しくチェックアウトしたブランチ上で行います。

  1. ./prisma/migrationsディレクトリのすべての内容を削除します。

  2. ./prisma/migrationsディレクトリ内に新しい空のディレクトリを作成します。このガイドでは、これを000000000000_squashed_migrationsと呼びます。この中に、新しい空のmigration.sqlファイルを追加します。

    情報

    マイグレーションディレクトリ内で最初のマイグレーションにするため、マイグレーションに先行ゼロを付けて000000000000_squashed_migrationsという名前を付けます。Migrateはディレクトリ内のマイグレーションを辞書順(アルファベット順)で実行します。migrate devを使用すると、日付と時刻をプレフィックスとしてマイグレーションが生成されるのはこのためです。例えば0_squashed202207180000_squashedのように、後のマイグレーションよりも低い順序でソートされる限り、別の名前を付けることもできます。

  3. 以下の状態にする単一のマイグレーションを作成します。

    • 空のデータベースから
    • ./prisma/schema.prismaファイルに記述されている本番データベーススキーマの現在の状態へ
    • そして、これを上記で作成したmigration.sqlファイルに出力します。

    これはmigrate diffコマンドを使用して行うことができます。プロジェクトのルートディレクトリから、以下のコマンドを実行します。

    npx prisma migrate diff \
    --from-empty \
    --to-schema-datamodel ./prisma/schema.prisma \
    --script > ./prisma/migrations/000000000000_squashed_migrations/migration.sql
  4. このマイグレーションが本番環境で適用済みであることをマークし、そこで実行されるのを防ぎます。

    これは、migrate resolveコマンドを使用して、000000000000_squashed_migrationsディレクトリ内のマイグレーションを既に適用済みとしてマークすることで行うことができます。

    npx prisma migrate resolve \
    --applied 000000000000_squashed_migrations

これで、本番環境に適用済みとしてマークされた単一のマイグレーションファイルができました。新しいチェックアウトでは、本番データベーススキーマの状態にするための単一のマイグレーションのみが取得されます。

本番データベースには、マイグレーションテーブルに適用されたマイグレーションの履歴がまだ含まれています。マイグレーションフォルダとデータモデルの履歴も、ソース管理で引き続き利用可能です。

© . All rights reserved.