跳到主要內容

從 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 && npm install @prisma/client
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.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 查詢替換 Prisma Client 1 查詢。Prisma Client 參考是學習如何使用最新 Prisma Client 的有用資源。

總結

我希望這份簡短的指南能幫助你走上正確的道路。如果你有任何問題或疑問,請告訴我們。我們非常感謝這些年來的支援。

© . This site is unofficial and not affiliated with Prisma Data, Inc.