マイグレーションのスカッシュ
このガイドでは、複数のマイグレーションファイルを単一のマイグレーションにスカッシュする方法を説明します。
マイグレーションのスカッシュについて
マイグレーションファイルの一部またはすべてを単一のマイグレーションにスカッシュすると便利な場合があります。このガイドでは、これを行うべき2つのシナリオを説明します。
- ローカルマイグレーションをマージ前に1つにスカッシュして、開発環境からクリーンに移行する
- すべてのマイグレーションを単一ファイルにスカッシュして、本番環境でクリーンな履歴を作成する
どちらのケースでも、Prisma Migrateはmigrate diff
コマンドを使用して2つのデータベーススキーマを比較し、一方からもう一方へ移行するための単一のSQLファイルを出力することで、これを行うツールを提供します。このガイドの残りの部分では、これら2つのシナリオで実行する方法を詳細に説明します。
開発環境からクリーンに移行する
マイグレーションのスカッシュは、ブランチベースのワークフローで開発する際に役立ちます。機能ブランチでの大規模なローカル開発中に、migrate dev
を使用して複数のマイグレーションを生成することがあります。機能が完成した後、マイグレーション履歴には、main
ブランチにプッシュされる最終的なマイグレーション履歴には不要な中間ステップが含まれる場合があります。
本番環境で中間ステップを適用することを避けるべき重要な理由があるかもしれません(データが失われたり、極端に遅くなったり、中断を引き起こしたりする可能性があります)。そうでない場合でも、本番環境のマイグレーション履歴の煩雑さを避けたいと思うかもしれません。
migrate dev
を使用してこれを達成するための詳細な手順については、「開発環境からクリーンに移行する方法」のセクションを参照してください。
本番環境でクリーンな履歴を作成する
マイグレーションのスカッシュは、本番環境で全てのマイグレーションファイルを1つにスカッシュするためにも使用できます。これは、本番環境に長いマイグレーション履歴が蓄積され、中間ステップに余分な時間が必要となるため、新しい環境でそれを再現することが負担になっている場合に役立ちます。チームがマイグレーションステップから価値を得ていない(そして、いざとなればバージョン管理履歴からそれらを取り戻せる)ため、履歴全体を単一のマイグレーションにスカッシュすることが決定されます。
migrate diff
とmigrate resolve
を使用してこれを達成するための詳細な手順については、「本番環境でクリーンな履歴を作成する方法」のセクションを参照してください。
マイグレーションをスカッシュする際の考慮事項
マイグレーションをスカッシュする際、migration.sql
ファイル内で手動で変更または追加されたSQLは保持されないことに注意してください。ビューやトリガーなどのカスタム追加を含むマイグレーションファイルがある場合は、マイグレーションがスカッシュされた後にそれらを再追加するようにしてください。
マイグレーションをスカッシュする方法
このセクションでは、上記で議論した2つのシナリオでマイグレーションをスカッシュする方法について、ステップバイステップの手順を説明します。
開発環境からクリーンに移行する方法
マイグレーションをスカッシュする前に、以下の開始条件を満たしていることを確認してください。
- スカッシュするマイグレーションの内容は、まだ本番データベースに適用されていません。
- 本番環境に適用されたすべてのマイグレーションは、既にローカルのマイグレーション履歴の一部です。
- ブランチに追加した新しいマイグレーションファイルのいずれにも、カスタムSQLが含まれていません。
機能ブランチを作成した後、本番データベースのマイグレーション履歴が分岐している場合、まず本番環境からのマイグレーション履歴とデータモデルの変更をローカル履歴にマージする必要があります。
次に、以下の手順に従ってください。
-
ローカルの
./prisma/migrations
フォルダの内容をmain
ブランチのマイグレーション履歴に一致するようにリセットします。 -
新しいマイグレーションを作成します。
npx prisma migrate dev --name squashed_migrations
これにより、以下の状態にする単一のマイグレーションが作成されます。
- リセットされたマイグレーション履歴に記述されている
main
ブランチの状態から ./prisma/schema.prisma
ファイルに記述されているローカル機能の状態へ- そして、これを
squashed_migrations
で終わる新しいディレクトリ内の新しいmigration.sql
ファイルに出力します(--name
フラグで指定)。
- リセットされたマイグレーション履歴に記述されている
この単一のマイグレーションファイルは、migrate deploy
を使用して本番環境に適用できるようになります。
本番環境でクリーンな履歴を作成する方法
マイグレーションをスカッシュする前に、以下の開始条件を満たしていることを確認してください。
- マイグレーション履歴内のすべてのマイグレーションが本番データベースに適用されています。
- データモデルがマイグレーション履歴と一致しています。
- データモデルとマイグレーション履歴が同期しています。
次に、これらの手順に従ってください。これは、main
ブランチ上で行うか、または他の変更が加えられる前にmain
にマージされる新しくチェックアウトしたブランチ上で行います。
-
./prisma/migrations
ディレクトリのすべての内容を削除します。 -
./prisma/migrations
ディレクトリ内に新しい空のディレクトリを作成します。このガイドでは、これを000000000000_squashed_migrations
と呼びます。この中に、新しい空のmigration.sql
ファイルを追加します。情報マイグレーションディレクトリ内で最初のマイグレーションにするため、マイグレーションに先行ゼロを付けて
000000000000_squashed_migrations
という名前を付けます。Migrateはディレクトリ内のマイグレーションを辞書順(アルファベット順)で実行します。migrate dev
を使用すると、日付と時刻をプレフィックスとしてマイグレーションが生成されるのはこのためです。例えば0_squashed
や202207180000_squashed
のように、後のマイグレーションよりも低い順序でソートされる限り、別の名前を付けることもできます。 -
以下の状態にする単一のマイグレーションを作成します。
- 空のデータベースから
./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 -
このマイグレーションが本番環境で適用済みであることをマークし、そこで実行されるのを防ぎます。
これは、
migrate resolve
コマンドを使用して、000000000000_squashed_migrations
ディレクトリ内のマイグレーションを既に適用済みとしてマークすることで行うことができます。npx prisma migrate resolve \
--applied 000000000000_squashed_migrations
これで、本番環境に適用済みとしてマークされた単一のマイグレーションファイルができました。新しいチェックアウトでは、本番データベーススキーマの状態にするための単一のマイグレーションのみが取得されます。
本番データベースには、マイグレーションテーブルに適用されたマイグレーションの履歴がまだ含まれています。マイグレーションフォルダとデータモデルの履歴も、ソース管理で引き続き利用可能です。