從 MongoDB Beta 升級
簡介
本指南協助您從 Prisma 1 MongoDB Beta 遷移至 Prisma ORM 2 或更高版本上的 MongoDB。若要深入了解 Prisma 1 與 Prisma ORM 2.x 及更高版本之間的差異,請參閱此文件。
本指南的範圍是為您提供執行遷移的必要工作流程,並重點說明您可能遇到的一些問題。
我們很遺憾無法涵蓋所有可能的場景或所需變更,但本指南應能幫助您順利完成遷移。如有任何問題,請加入我們的 Discord 或在 Github 上建立 issue 。
在生產環境中嘗試之前,請先在您的預備環境中執行此遷移!
需求
安裝 Prisma ORM 3.12.0 或更高版本
在您的專案目錄中執行以下命令
$ npm install prisma@latest
$ npx prisma init --datasource-provider=mongodb
這應該會建立以下檔案
prisma/schema.prisma
:初始 Prisma schema.env
:環境檔案,您將在其中儲存連線字串
如果您看到以下錯誤
ERROR File schema.prisma already exists in your project.
Please try again in a project that is not yet using Prisma.
您的專案中可能已經有一個 prisma/
目錄。將該目錄重新命名為類似 _prisma/
的名稱,然後再試一次
尋找您 MongoDB 資料庫的連線字串
接下來,您需要找到您 MongoDB 資料庫的連線字串。您應該可以在您的 docker-compose.yml
檔案或 MongoDB Atlas 上找到它。這就是您傳遞給 MongoDB Compass 的內容。連線字串應如下所示
mongodb://<user>:<pass>@<host>:27017
在 Prisma 1 中儲存應用程式資料的資料庫稱為 default_default
,因此我們將其新增至連線字串的末尾,並更新 .env
檔案中的 DATABASE_URL
鍵
DATABASE_URL="mongodb://prisma:prisma@localhost:27017/default_default"
內省您的 MongoDB 資料庫
現在您可以將資料庫的結構提取到您的 Prisma Schema 中。
$ npx prisma db pull
您應該會在 prisma/schema.prisma
中看到您的 Prisma schema,其中已填入您的模型。
如果您看到以下錯誤:Error in connector: SCRAM failure: Authentication failed.
,請嘗試在您的連線字串末尾新增 ?authSource=admin
,然後再試一次。
潤飾您的 Prisma Schema
從新內省的基於 Prisma 1 的 MongoDB 資料庫產生的 Prisma Client 可能沒有最佳的 API。您可以調整模型名稱和欄位,只需確保使用 @map
和 @@map
將原始名稱對應到基礎資料庫集合和欄位名稱即可
- model posts {
+ model Post {
id String @id @default(auto()) @map("_id") @db.ObjectId
published Boolean
title String
+ @@map("posts")
}
- model users {
+ model User {
id String @id @default(auto()) @map("_id") @db.ObjectId
email String @unique(map: "email_U")
name String
- posts String[] @db.ObjectId
+ postIds String[] @db.ObjectId @map("posts")
@@index([posts], map: "posts_R")
+ @@map("users")
}
在執行這些重新命名時請謹慎,因為您需要確保 Prisma Schema 仍然正確對應到基礎資料庫集合和欄位名稱。
與 SQL 資料庫不同,MongoDB 沒有對資料之間關係的明確理解。這表示 Prisma ORM 的內省無法為您推斷這些關係。
我們通常建議在 此文件 的幫助下,手動新增關係。但是,Prisma 1 儲存外鍵的方式與 Prisma ORM 2 及更高版本期望外鍵的位置不同,因此如果您想利用關係,您需要在新增關係之前,將外鍵移動到資料庫上的位置。
💡 下載 Prisma VSCode 擴充功能,以便在您轉換 Prisma schema 時提供自動完成和有用的錯誤訊息。
產生 Prisma Client
在 Prisma schema 中填入您的資料 schema 後,您現在可以產生一個 Typescript Client 來讀取和寫入您的 MongoDB 資料庫。
$ npx prisma generate
測試讀取
建立一個簡單的 test.ts
腳本,以驗證 Prisma Client 是否可以讀取和寫入您的應用程式。請注意,本指南使用的是 Prisma 1 範例儲存庫 中的範例,但程式碼會根據您的應用程式而有所不同。
import { PrismaClient } from '@prisma/client'
const prisma = new PrismaClient()
async function main() {
await prisma.$connect()
const posts = await prisma.post.findMany()
console.log(posts)
}
main()
.catch(console.error)
.finally(() => prisma.$disconnect())
請確保已全域安裝 ts-node
並執行
ts-node test.ts
您應該會看到您的資料列表
[
{
comments: [],
id: '62435a83fca136000996ba16',
content: 'https://prisma.dev.org.tw/day/',
published: true,
title: 'Join us for Prisma Day 2019 in Berlin',
wasCreated: 2022-03-29T19:14:11.172Z,
wasUpdated: 2022-03-29T19:14:11.172Z
},
{
comments: [ [Object] ],
id: '62435a83fca136000996ba18',
content: 'https://graphqlweekly.com/',
published: true,
title: 'Subscribe to GraphQL Weekly for community news',
wasCreated: 2022-03-29T19:14:11.369Z,
wasUpdated: 2022-03-29T19:14:11.369Z
},
{
comments: [],
id: '62435a83fca136000996ba1a',
content: 'https://twitter.com/prisma',
published: false,
title: 'Follow Prisma on Twitter',
wasCreated: 2022-03-29T19:14:11.375Z,
wasUpdated: 2022-03-29T19:14:11.375Z
}
]
測試寫入
然後您可以修改您的 test.ts
以嘗試寫入
import { PrismaClient } from '@prisma/client'
const prisma = new PrismaClient()
async function main() {
await prisma.$connect()
const user = await prisma.user.create({
data: {
email: 'alice@prisma.io',
name: 'Alice',
},
})
console.log(user)
}
main()
.catch(console.error)
.finally(() => prisma.$disconnect())
您應該會看到已建立使用者。
如果您看到以下錯誤
Prisma needs to perform transactions, which requires your MongoDB server to be run as a replica set. https://pris.ly/d/mongodb-replica-set
這表示您的 MongoDB 資料庫未以副本集形式執行。請參閱上面的連結,以取得解決此問題的步驟。
升級您的應用程式
現在您已經有了可運作的 Prisma Client,您可以開始將 Prisma Client 1 查詢替換為最新的 Prisma Client 查詢。Prisma Client 參考是學習如何使用最新 Prisma Client 的實用資源。
結論
希望這份簡短指南對您開始走上正確的道路有所幫助。如果您有任何問題或疑慮,請告訴我們。我們非常感謝您多年來的支持。