基本的なワークフロー
上はprisma generateを使った場合のワークフローだが、prisma migrateでもほとんど同じ:
-
prismaと@prisma/clientをインストール-
prismaはコマンドラインツール(以前は@prisma/cliだった)。--save-devで構わない -
@prisma/clientはJavaScript/TypeScriptから操作するためのインターフェースライブラリ。
-
-
prisma initで初期化。- この段階で、設定ファイル類(
prisma/schema.prisma,.envなど)が自動的に生成される。 - 「次のステップ」がコンソール上に表示されるので、そこまで迷わないはず
- この段階で、設定ファイル類(
- スキーマを設定ファイル
prisma/schema.prismaで編集- 編集するごとに
prisma migrateでマイグレーションをすると、データベースのアップデート以外にJavaScript/TypeScriptのファイルが自動生成される。 -
@prisma/clientから、データベース操作用クラスをインポートして使える。
- 編集するごとに
インストール
npm i prisma --save-dev
npm i @prisma/client
設定ファイルの生成・初期化
npx prisma init
-
--datasource-prividerオプションをつけることで、データベースのタイプを指定できる(デフォルトだとpostgresqlだったはず) -
prisma/schema.prisma上で、データベースのタイプを指定。 -
.env上で、データベースのURLを指定- ふつうのデータベースなら
<provider-type>://<host>:<port>でよい - SQLiteなら
file:./<database-name>.dbのような相対パスとして指定
- ふつうのデータベースなら
スキーマの編集
例:
"schema.prisma"
// ...
model Post {
id Int @id @default(autoincrement())
title String @db.VarChar(200)
published Boolean @default(true)
content String
authorId Int
author User @relation(fields: [authorId], references: [id])
categories Category[]
}
// ...
関連付けの方法:
- *-to-oneの関係の場合:
@relationを使う(上のauthor User)。fieldsで指定、関連づけるエンティティのID(上ではauthorId)を保持しておいて、「このフィールドを使って別のエンティティを関連づける」ことを指示できる。 - one-to-manyの関係の場合:配列型の属性を定義(上の
categories Category[])。逆側のエンティティで@relationの指定をしている場合、referencesで指定したフィールドを用いた関連付けが行われる(上のauthor Userの例なら、UserはそのフィールドPosts[]の関連付けに、Postのidを使用する)。
マイグレーション
npx prisma migrate dev ...
-
--create-onlyを入れると、マイグレーション用のSQL文は生成するがデータベースには適用しない。生成された文を自分でカスタマイズすることも可能。 -
--preview-featureを入れると、(おそらく)どういうことをするかをコンソール上に表示してくれる(のだと思う)。 -
--name <stage name>を入れると、マイグレーション名を指定できる。自分なりのマイグレーション内容の説明を入れたりするのに使う。
いちおうprisma db pushというコマンドも存在している。これはマイグレーションを「オフィシャル」なものにする前にプロトタイピングをして動作を確認したい場合に使うようだけれど、詳細は今のところ知らない。
参考
一般
- https://www.prisma.io/docs/getting-started/setup-prisma/start-from-scratch
- https://www.freecodecamp.org/news/build-nodejs-database-using-prisma-orm/
- https://dev.to/aryanjnyc/introduction-to-prisma-with-next-js-1l0
マイグレーション
- https://www.prisma.io/docs/guides/database/developing-with-prisma-migrate
- https://www.prisma.io/blog/prisma-migrate-preview-b5eno5g08d0b
- https://www.prisma.io/docs/guides/database/prototyping-schema-db-push
