跳到主要內容

從 MongoDB Beta 升級

簡介

本指南協助您從 Prisma 1 MongoDB Beta 遷移至 Prisma ORM 2 或更高版本上的 MongoDB。若要深入了解 Prisma 1 與 Prisma ORM 2.x 及更高版本之間的差異,請參閱此文件

本指南的範圍是為您提供執行遷移的必要工作流程,並重點說明您可能遇到的一些問題。

我們很遺憾無法涵蓋所有可能的場景或所需變更,但本指南應能幫助您順利完成遷移。如有任何問題,請加入我們的 Discord 或在 Github 上建立 issue

警告

在生產環境中嘗試之前,請先在您的預備環境中執行此遷移!

需求

  • 必須以副本集形式執行 MongoDB 4.2+ (MongoDB Atlas 會自動為您執行此操作)
  • Node.js:請參閱系統需求
  • TypeScript:請參閱系統需求

安裝 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

.env
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 的實用資源。

結論

希望這份簡短指南對您開始走上正確的道路有所幫助。如果您有任何問題或疑慮,請告訴我們。我們非常感謝您多年來的支持。