🚀

Blitz.js の prisma で MongoDB を使う!!!!

2021/08/07に公開

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

iduseruserID は複数箇所にあるので全部変更するべし。

参考文献


.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