結論
既存のDBにPrismaを導入するときはBaselineを設定しよう!
経緯
Prismaのドキュメントを読み進めていたとき、既存のプロジェクトにPrismaを導入するときの手順としてBaseline your databaseという項目が出てきました。
Baseline your database : typescript-postgresql | Prisma Docs
このドキュメントの手順通りに進めればBaselineは作成できるのですが、概要を理解するのに少し時間が掛かりました。
また、Baselineに関して日本語では触れている記事が少なかったのでまとめてみました。
Baselineが必要な理由
既にデータベースが存在する既存のプロジェクトにPrisma Migrateを追加すると、「最初のマイグレーション(Initial migration)」が生まれます。
このマイグレーションには、Prisma Migrateを使用する前のデータベースの状態を再現するために必要なすべてのSQLが含まれます。
しかし、本番環境ではデータベースの状態の再現(作成やリセット)は必要ないので、この「最初のマイグレーション」は含めないようにする必要があります。
(もし含めてしまうと、エラーが発生してしまう可能性があります)
そのため、Baselineが必要になります。
Baselining tells Prisma Migrate to assume that one or more migrations have already been applied. This prevents generated migrations from failing when they try to create tables and fields that already exist.
ベースライン化はPrisma Migrateに、1つ以上の移行がすでに適用されていると仮定するように指示します。これにより、生成されたマイグレーションがすでに存在するテーブルやフィールドを作成しようとして失敗するのを防ぐことができます。
Baselining a database | Prisma Docs
つまり、Baselineを設定することで、Prisma Migrateに「このマイグレーションまでは適用済みである」と伝えることができます。
これによって、Prisma Migrateは、Baselineとして指定されたマイグレーションより前のマイグレーションを適用済みとみなし、それ以降のマイグレーションのみを適用します。
その結果、既存のテーブルやフィールドを再作成しようとするエラーを防ぐことができます。
どんなときに使えばいい?
例えば、それまでは違うORMでDBを操作していて、Prismaへと移行するときはBaselineが必要となるでしょう。
逆に最初からPrismaを使ってDBと紐づけていたときは、「データベースの状態を再現するマイグレーションファイル」は生まれないはずです。このときは特に気にせず、開発を進めても大丈夫だと思います。