みなさんこんにちわ!前回は、Express、Prisma、PostgreSQLを使ってバックエンドの環境を作成しました。

今回は、Prismaのコマンドについて1つずつ解説します。
prisma init
$ prisma init
# データベースの指定
$ prisma init --datasource-provider sqlite
一番最初に実行するコマンドで、node.jsのプロジェクトにPrismaを適応するためのコマンドです。prismaディレクトリや、環境変数を設定するための.envファイルなどを自動作成します。
–datasource-providerオプションを指定することで、providerの値やURLのテンプレートを変更してくれます。デフォルトはPostgreSQLになっています。
データソースは、以下に対応しています。
- sqlite
- postgresql
- mysql
- sqlserver
- mongodb
- cockroachdb
prisma generate
$ prisma generate
# 特定のschemaファイルを指定する
$ prisma generate --schema=xxx/schema.prisma
# 変更を即時反映させる
$ prisma generate --watch
schema.prismaファイルを読み取り、クライアント側の型定義されたファイルなどを生成するためのコマンドです。**./node_modules/.prisma/client/**ディレクトリに生成します。
generateコマンドは、以下の設定をschemaファイルにしておく必要があります。
generator client {
provider = "prisma-client-js"
}
デフォルトでは、prisma/schema.prismaファイルが読み込まれます。s–schemaオプションを追加することで、任意のファイルを指定できます。
また、–watchコマンドを追加することで、起動している間の変更を自動反映します。
prisma introspect
※ Prisma3.0.0以降、非推奨コマンドとなっているため割愛。
prisma validate
$ prisma validate
# 任意のschemaファイルを指定
$ prisma validate --schema=xxx/schema.prisma
schema.prismaファイルの構文をチェックします。
デフォルトはprisma/schema.prismaファイルです。–schemaオプションで、指定したファイルをチェックします。
※ DATABASE_URLの環境変数が設定されているかも含めてチェックされるため注意。
prisma format
$ prisma format
# 任意のschemaファイルを指定
$ prisma format --schema=xxx/schema.prisma
schema.prismaファイルを見やすいようにインデントなどを整形します。
デフォルトはprisma/schema.prismaファイルです。–schemaオプションで、指定したファイルを整形します。
prisma db
PrismaでDB側を操作するためのコマンドになります。
dbコマンドを実行するには、datasourceの設定をshcema.prismaファイルに設定する必要があります。
// 例
datasource db {
provider = "sqlite"
url = "file:my-database.db"
}
prisma db pull
$ prisma db pull
# 任意のschemaファイルを指定
$ prisma db pull --schema=xxx/schema.prisma
# 強制的にファイルを上書きする
$ prisma db pull --force
# ファイルに書き込む代わりに、結果を標準出力する
$ prisma db pull --print
DBを分析し、schema.prismaファイルを生成します。これは、非常に危険な操作のため、注意してください。
デフォルトはprisma/schema.prismaファイルです。–schemaオプションで、指定したファイルを上書きします。
prisma db push
$ prisma db push
# 任意のschemaファイルを指定
$ prisma db push --schema=xxx/schema.prisma
# generateをスキップする
$ prisma db push --skip-generate
# データベースをリセットして更新する
$ prisma db push --force-reset
# データ損失の警告を無視して更新する
$ prisma db push --accept-data-loss
schema.prismaファイルを分析し、DBを更新します。migrationファイルなどを生成せずにDB更新をしてくれるため、開発途中などの場合に使用できます。
デフォルトはprisma/schema.prismaファイルです。–schemaオプションで、指定したファイルを反映します。
prisma db seed
$ prisma db seed
seedファイルをもとに、DBへ初期データを登録します。
seedファイルを使うには、以下のようにpackage.jsonに追加しておく必要があります。
環境によって若干異なるため、自分にあったものを設定してください。
"prisma": {
"seed": "ts-node prisma/seed.ts" // TypeScriptの場合(型チェックあり)
"seed": "ts-node --transpile-only prisma/seed.ts"// (型チェックなし)
"seed": "node prisma/seed.js" // JavaScriptの場合
},
seedは明示的に呼び出したいときに使います。たとえば、初期の開発環境設定の際や、テスト実行前にUT用のデータを投入するときなどです。
seedファイルは、PrismaClientの記法で作成します。詳細は別途解説します。 ※準備中
prisma db execute
# input(SQL記述)がxxx.sql output(DB)がschema.prisma
$ prisma db execute --file xxx.sql --schema xxx/schema.prisma
# input(SQL記述)が標準入力 output(DB)がURL
$ echo 'SQL文' | prisma db execute --stdin --url="$DATABASE_URL"
SQL文を使用して、DBを更新するコマンドです。SQLとデータソースを指定する必要があります。
- SQL
- –fileオプションで、SQLファイルを指定する
- –stdinオプションで、標準入力から指定する
- データソース
- –schemaオプションで、schema.prismaファイルにあるdatasourceを使用する
- –urlオプションで、直接URLを指定する
prisma migrate
Prismaでmigrateするためのコマンドです。migrateはそもそも、移行するっという意味があります。
migrationファイルを作ったり、作られたファイルをもとに、DBを作成できます。
開発したDBを検証や本番環境へ反映させる際にも使用します。反映させるためのコマンド、失敗した場合に、状態を確認するコマンドなどが用意されています。
反映に失敗したときは、以下を参考にしてみてください。
https://www.prisma.io/docs/guides/database/production-troubleshooting#fixing-failed-migrations-with-migrate-diff-and-db-execute
prisma migrate dev
$ prisma migrate dev --name [FileName]
# 任意のschemaファイルを指定
$ prisma migrate dev --schema=xxx/schema.prisma
# migrateファイルを作らずにDBを更新
$ prisma migrate dev --schema=xxx/schema.prisma
# generateをスキップする
$ prisma migrate dev --skip-generate
# seedをスキップする
$ prisma migrate dev --skip-seed
DBの作成、更新します。主に開発環境で使用します。./prisma/migrationsディレクトリの下に、migrateファイルが履歴で作成されます。–nameの後に入力した文字が、作成されたファイルにも記載されます。
generateやseedなども実行されます。それぞれオプションをつけることでスキップします。
また、–create-onlyオプションを付けることで、migrateファイルだけを作成できます。
デフォルトはprisma/schema.prismaファイルです。–schemaオプションで、指定したファイルを反映します。
prisma migrate reset
$ prisma migrate reset
# 任意のschemaファイルを指定
$ prisma migrate reset --schema=xxx/schema.prisma
# DBを削除してから再度作成する
$ prisma migrate reset --force
# generateをスキップする
$ prisma migrate reset --skip-generate
# seedをスキップする
$ prisma migrate reset --skip-seed
DBのリセットしてから、再度作成します。主に開発環境で使用します。
generateやseedなども実行されます。それぞれオプションをつけることでスキップします。
–forceをつけた場合は、確認プロンプトがスキップされます。
デフォルトはprisma/schema.prismaファイルです。–schemaオプションで、指定したファイルを反映します。
prisma migrate deploy
$ prisma migrate deploy
# 任意のschemaファイルを指定
$ prisma migrate deploy --schema=xxx/schema.prisma
DBをmigrateファイルに基づいて、移行します。主に検証や本番環境などで使います。
prisma migrate resolve
$ prisma migrate resolve
# 問題を解決
$ prisma migrate resolve --applied "yyyyMMddhhmmss_comments"
# 問題をロールバック
$ prisma migrate resolve --rolled-back "yyyyMMddhhmmss_comments"
# 任意のschemaファイルを指定
$ prisma migrate resolve --schema=xxx/schema.prisma
deployした際にエラーが発生した場合に使うコマンドです。
–appliedは、ネットワークエラーやサーバーダウンなど、SQLには問題ない場合に、手動で変更を適応して使います。
DBを戻して、必要があれば変更したい場合は、–rolled-backを使います。
prisma migrate status
$ prisma migrate status
./prisma/migrationsディレクトリにあるファイルと、DBにある履歴テーブルを比較して状態を出力します。
どのmigrateファイルが適応できていないかなどが確認できます。
prisma migrate diff
$ prisma migrate diff --from-... --to...
# fromとtoの差分を表示する。比較するもによってオプションを変更する
# --[from or to]-url データソース
# --[from or to]-migrations migrationsディレクトリのバス
# --[from or to]-schema-datamodel schema.prismaファイルへのパス
# --[from or to]-empty 比較先を空と仮定する
# migrateファイルと対象のDB
$ prisma migrate diff --from-migrations ./prisma/migrations --to-url postgres://xxxx
DBやmigrateファイル、schemaファイルを比較してSQLを出力します。outputでファイルを指定したり、prisma db execute –stdinにパイプで渡し、そのままDBに反映できます。
prisma studio
$ prisma studio
# ポートを指定
$ prisma studio --port 5000
# ブラウザの指定
$ prisma studio --browser firefox
# ブラウザを開かずに起動
$ prisma studio --browser none
ブラウザでDBの状態を確認、操作できるDBClientです。ポートを指定しないと、localhost:5555で開きます。
まとめ
- Prismaのコマンドについて解説しました。改めて全部のコマンドをチェックすると、すごい多機能であることがわかりました。
- DB変更や本番環境への更新は注意するべき作業なのですが、migrateコマンドがあるため、そのあたりもスムーズに行えそうです。
- 開発時はmigrate履歴を増やさないためにも、generateやdbコマンドを使うようにしましょう。
- clientソフトはこだわりがなければ、studioで良さそう。
次回は、schema.prismaに記法などについて、深く見ていこうと思います。
コメント