🐡

prisma migrationを途中から導入した話

2024/10/04に公開

目的

以前は、ローカルで開発をしており、データベースを更新する際は、npx prism db push(prisma_shema の型を強制的に DB に反映させること)をしていた。しかし、デプロイ後、DB を npx primsa db push で更新するとデータが消える恐れがあった。そこでマイグレーションを導入することにした。今回は、ローカル環境とデプロイ環境を分けて説明をすることにした。

マイグレーションとは

データベースのスキーマやデータ構造を新しいバージョンに更新する作業のこと。。これにより、データベースの構造や内容を安全に変更・移行することが可能です。たとえば、新しいテーブルを追加したり、既存のテーブルにカラムを追加・削除する場合などが含まれます。

migration 導入 (ローカル環境)

  • migraion の初期設定を行う。
# prsima migrationの初期設定
npx prisma migration init
  • 以下のファイルが生成される
.
└─ prisma
   ├── migration
   |    └── 202401010000_init
   |      └── migration.sql
   └── schema.prisma

migration 導入後(ローカル環境)

  • prisma_schema のファイルを変更

  • migration の実行

# migrationの作成
npx prisma migrate dev --name <マイグレーション名>

migration 導入 (デプロイ環境)

  • migration の初期設定を DB に反映
 npx prisma db execute --file ./prisma/migrations/20240713025925_init/migration.sql

migration  導入後 (デプロイ環境)

  • 変更した migaration を DB に反映していく。
npx prisma migration deploy

その他

migration deploy と migration dev の違い

# ------------例----------------------
# 2024年の1月1日にmigrationを導入
# 2024年の1月2日にmigrationを実行
# 2024年の1月3月にmigartionを実行
.
└─ prisma
   ├── migration
   |    ├── 202401010000_init
   |    | └── migration.sql
   |    ├── 202401020000_add_test_colum
   |    | └── migration.sql
   |    ├── 202401030000_add_test2_colum
   |     └── migration.sql
   └── schema.prisma

migration deploy

  • DB に migartion を反映していないところから migration を実行している。例として、202401010000_init のみの migration を DB に反映させた状態に migartion deploy を行うと 401020000_add_test_colum と 202401030000_add_test2_colum の migration が実行される。
# 差分の変更
npx prisma migration deploy

migration deploy

  • DB に migartion を最初から全て migration を実行している。例として、202401010000_init のみの migration を DB に反映させた状態に migartion dev を行うと て、202401010000_init と 401020000_add_test_colum と 202401030000_add_test2_colum の全ての migration が実行される。
# 全ての migration を変更
npx prisma migration dev

まとめ

migration を導入したおかげで DB の変更によるデータが消えることを防ぐことができた。

今後

現状では、migration を手動で行なっているが、今後は、CI/CD を導入して miration の自動化を行っていきたい。

GitHubで編集を提案

Discussion