マイグレーションのスクワッシュ
このガイドでは、複数のマイグレーションファイルを単一のマイグレーションにスクワッシュする方法について説明します。
マイグレーションのスクワッシュについて
マイグレーションファイルの一部または全部を単一のマイグレーションにスクワッシュすることが役立つ場合があります。このガイドでは、これを行うことが望ましい2つのシナリオについて説明します
- 開発環境からクリーンに移行する:ローカルのマイグレーションをマージ前に1つにスクワッシュする
- 本番環境でクリーンな履歴を作成する:すべてのマイグレーションを単一のファイルにスクワッシュする
どちらの場合も、Prisma Migrateはこれを行うためのツールを提供します。migrate diff
コマンドを使用して2つのデータベーススキーマを比較し、一方から他方への移行を単一のSQLファイルとして出力します。このガイドの残りの部分では、これら2つのシナリオでこれを実行する方法の詳細な手順を説明します。
開発環境からクリーンに移行する
マイグレーションのスクワッシュは、ブランチベースのワークフローで開発する際に役立ちます。フィーチャーブランチでの大規模なローカル開発作業中に、migrate dev
を使用して複数のマイグレーションを生成する場合があります。機能が完了した後、マイグレーション履歴には、main
ブランチにプッシュされる最終的なマイグレーション履歴に不要な中間ステップが含まれる可能性があります。
本番環境で中間ステップの適用を避けるべき重要な理由があるかもしれません(データが失われたり、非常に遅く/破壊的になる可能性があります)。そうでない場合でも、本番環境のマイグレーション履歴の clutter を避けたい場合があります。
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
で終わる新しいディレクトリ(--name
フラグで指定)の新しいmigration.sql
ファイルに出力します。
- リセットされたマイグレーション履歴で説明されている
この単一のマイグレーションファイルは、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
これで、本番環境に適用済みとしてマークされた単一のマイグレーションファイルが作成されます。新しいチェックアウトでは、本番データベーススキーマの状態に移行する単一のマイグレーションのみが取得されます。
本番データベースには、マイグレーションテーブルに適用されたマイグレーションの履歴がまだ含まれています。マイグレーションフォルダーとデータモデルの履歴も、ソース管理で引き続き利用できます。