🚀
Blitz.js の prisma で MongoDB を使う!!!!
Blitz.jsをインストールしてプロジェクトを生成する
npm install -g blitz --legacy-peer-deps
cd blitz-hoge
参考文献
db/schema.prisma
を編集する
注意点
- prismaのMongoDB対応はPreviewFeature
- Cascading delete(リレーションを張った親モデルが消えたら子モデルも消す等)もPreviewFeature
- provider = "sqlite"
+ provider = "mongodb"
+ previewFeatures = ["mongoDb", "referentialActions"]
- id Int @id @default(autoincrement())
+ id String @id @default(dbgenerated()) @map("_id") @db.ObjectId
...
- user User? @relation(fields: [userId], references: [id])
+ user User? @relation(fields: [userId], references: [id], onDelete: Cascade)
- userId Int?
+ userId String? @db.ObjectId
id
と user
と userID
は複数箇所にあるので全部変更するべし。
参考文献
- https://www.prisma.io/docs/concepts/database-connectors/mongodb#example
- https://www.prisma.io/docs/concepts/components/prisma-schema/relations/referential-actions#enable-the-referentialactions-preview-feature
- https://www.prisma.io/docs/concepts/components/prisma-schema/relations/referential-actions#how-to-use-referential-actions
.env.local
を編集する
DATABASE_URLにMongoDBのユーザー名とパスワードと接続先とDB名を指定する
mongodb://USERNAME:PASSWORD@HOST/DATABASE
参考文献
切り替えたDBを初期化する
この手順が重要
blitz prisma generate
これでBlitz.jsのDBがMongoDBに切り替わった。はず。
別のDBに切り替える場合は blitz prisma generate
を実行しろってどこにも書かれて無くてハマりました。。
参考文献
Blitz.jsを起動して確認してみる
blitz dev
- http://localhost:3000/signup を開く
- 適当なメールアドレスとパスワードを入れてみる
- サインアップできれば成功 🎉
RDBの世界からオサラバする
MongoDBでやっていくと決めた時点で、RDBでしか必要なさそうなファイルは消してしまってヨシ!
rm -rf db/migrations
rm db/*.sqlite
rm db/*.sqlite-journal
npm test
を実行してみる
おもむろに - なんかハチャメチャなエラーが出る!!
- 理由1: prismaの
await db.$reset()
がMongoDBだと動かない!! - 理由2:
db/schema.prisma
で書いた@unique
制約がMongoDBだと無視されている!!
修正方法
app/auth/mutations/forgotPassword.test.ts
app/auth/mutations/resetPassword.test.ts
- の2つのファイルの以下の部分を変更する
- await db.$reset()
+ await db.user.deleteMany({ where: { email: "user@example.com" } })
これだけでなんとかテストは通るようになった
blitz generate ...
とかは動くんだろうか?
ところで……
blitz generate all post name:string description:string
エイヤで実行!!
CREATE app/pages/posts/[postId].tsx
CREATE app/pages/posts/[postId]/edit.tsx
CREATE app/pages/posts/index.tsx
CREATE app/pages/posts/new.tsx
✔ Compiled
CREATE app/posts/components/PostForm.tsx
CREATE app/posts/queries/getPost.ts
CREATE app/posts/queries/getPosts.ts
CREATE app/posts/mutations/createPost.ts
CREATE app/posts/mutations/deletePost.ts
CREATE app/posts/mutations/updatePost.ts
✔ Model 'Post' created in schema.prisma:
>
> model Post {
> id Int @id @default(autoincrement())
> createdAt DateTime @default(now())
> updatedAt DateTime @updatedAt
> name String
> description String
> }
>
✔ Run 'prisma migrate dev' to update your database? (Y/n) · false
ハイ、なるほど、 id
がRDBの世界観で生成されちゃってますね。
ここは手で直す必要がありそう。
そして prisma migrate dev
は絶対に n
を選ぶこと!!
ゴミが生成されます。
以上です。
Discussion