本文へスキップ

Prisma頻出コマンドとマイグレーションの運用

9

概要

TypeScript の ORM であるPrismaについて、 しばしば利用するコマンドを一覧にしました。

注意事項

参考にされる際には以下の点についてご留意いただいた上で、本家のドキュメントをご覧ください。

  • DB によってはサポートしていないコマンドがあります。
  • 破壊的な変更が発生するものがあります。

コマンド一覧

プロジェクト初期化に利用するコマンド

新しい Prisma プロジェクトをセットアップする

prisma init
# 利用するDBを指定できる
prisma init --datasource-provider sqlite
# 接続先(url)を指定できる
prisma init --url mysql://username:password@localhost:3306/mydb

バージョンを確認する

prisma version
# or
prisma -v
# jsonでもできます
prisma version --json

開発中に利用するコマンド

アーティファクトを生成する(例:Prisma クライアント)

prisma generate
# ./prisma/schema.prisma 以外のパスを指定できる
prisma generate --schema=./alternative/schema.prisma
# ファイルの変更を監視できる
prisma generate --watch
# 特定のジェネレータを指定して生成できる。複数も可能。
prisma generate --generator client --generator zod_schemas

Prisma スキーマを検証する

prisma validate
# ./prisma/schema.prisma 以外のパスを指定できる
prisma validate --schema=./alternative/schema.prisma

Prisma スキーマをフォーマットする

prisma format
# ./prisma/schema.prisma 以外のパスを指定できる
prisma format --schema=./alternative/schema.prisma

既存のデータベースからスキーマを取得し、Prisma スキーマを更新する

prisma db pull
# ./prisma/schema.prisma 以外のパスを指定できる
prisma db pull --schema=./alternative/schema.prisma
# ファイルではなく標準出力に結果を表示する
prisma db pull --print
# 強制オプション
prisma db pull --force

Prisma スキーマの状態をデータベースにプッシュする

prisma db push
# ./prisma/schema.prisma 以外のパスを指定できる
prisma db push --schema=./alternative/schema.prisma
# アーティファクト生成をスキップ
prisma db push --skip-generate
# データベースをリセットしてからスキーマを更新。
prisma db push --force-reset
# データが消える警告を無視。
prisma db push --accept-data-loss

Seedを利用する。

prisma db seed
# パスの指定や接続先の指定も可能
prisma db seed --schema=./hoge/schema.prisma --url=mysql://username:password@localhost:3306/mydb

prisma studioの起動。

prisma studio
# 8080ポートで起動
prisma studio --port 8080

マイグレーションや運用作業で利用する

Prisma スキーマからマイグレーションを作成し、データベースに適用し、アーティファクトを生成する(例:Prisma クライアント)

# マイグレーションを実行する
prisma migrate dev
# マイグレーションのSQLの生成のみを行う
prisma migrate dev --create-only
# マイグレーション名を指定する
prisma migrate dev --name
# seedの適用をスキップする
prisma migrate dev --skip-seed
# generatorの利用をスキップする
prisma migrate dev --skip-generate

マイグレーションの解決

# マイグレーション名を指定して移行を適用済みにする
prisma migrate resolve --applied ”20201231000000_add_users_table”
# マイグレーション名を指定してロールバックする
prisma migrate resolve --rolled-back "20201231000000_add_users_table"

マイグレーション状況の確認

prisma migrate status

diff の取得

# diffを表示する
prisma migrate diff \
  --from-url "$DATABASE_URL" \
  --to-url "postgresql://login:password@localhost:5432/db2"
# diffをsqlとして書き出す
prisma migrate diff \
 --from-url "$DATABASE_URL" \
 --to-migrations ./migrations \
 --script > script.sql

マイグレーションのリセット (本番環境では利用するものではないと思われる)

# リセットを行う。
prisma migrate reset
# 警告をスキップ
prisma migrate reset --force
# generatorやseedをスキップ
prisma migrate reset --skip-generate --skip-seed
# ./prisma/schema.prisma 以外のパスを指定できる
prisma migrate reset --schema=./alternative/schema.prisma

SQL を実行する

# ファイルを指定してSQLを実行する
prisma db execute --file ./script.sql --schema schema.prisma
# 標準出力を利用してSQLを実行する
echo 'TRUNCATE TABLE dev;' | prisma db execute --stdin --url="mysql://username:password@localhost:3306/mydb"

個人的な運用方法

ステージング環境とプロダクション環境でマイグレーション履歴を同期することを前提に 次のような手順で管理するのが良いのかなと思います。

ステージング

# マイグレーションファイルを生成
prisma migrate dev --name migration1 --create-only

プロダクション

# マイグレーションファイルをプロダクション環境に適用
prisma migrate deploy

参考

Prisma CLI Command Reference

開発・CI・本番の使い分け

環境 主なコマンド 役割
プロトタイプ prisma db push migrationを作らずスキーマを素早く反映
開発 prisma migrate dev migrationの生成・適用とdrift検出
CI prisma validate / prisma generate schema検証とClient生成
ステージング・本番 prisma migrate deploy コミット済みの未適用migrationだけを適用

migrate dev は開発用であり、本番では実行しません。migrate deploy は通常CI/CDから実行し、prisma/migrationsschema.prisma を一緒にバージョン管理します。

安全なマイグレーションのチェックリスト

  • 生成された migration.sql をレビューする
  • renameがdrop/addとして生成されていないか確認する
  • NOT NULL列の追加時に既存行をどう埋めるか決める
  • 大きなテーブルのロック時間とインデックス作成方式を確認する
  • deploy前にバックアップと復旧手順を確認する
  • アプリの旧版・新版が移行中の両スキーマで動けるか検討する
  • 失敗時に migrate resolve を使う条件を事前に決める

コマンド例は記事執筆時点のPrisma CLIを基準にしています。オプションは変更される可能性があるため、実行前にプロジェクトで固定したバージョンの prisma <command> --help を確認してください。

公式資料

最新の記事

著者について

404

s-yoshiki

ただの備忘録です。

※外部送信に関する公表事項