从 MongoDB Beta 升级
简介
本指南帮助您从 Prisma 1 MongoDB Beta 迁移到 Prisma ORM 2 或更高版本上的 MongoDB。要了解有关 Prisma 1 和 Prisma ORM 2.x 及更高版本之间差异的更多信息,请参阅 此文档。
本指南的范围是为您提供执行迁移所需的流程并突出显示您可能会遇到的问题。
不幸的是,我们无法涵盖所有可能的情况或所需的更改,但本指南应该可以帮助您完成您的旅程。加入 我们的 Discord 或创建一个问题 在 Github 上,如有任何疑问。
在生产环境中尝试之前,请在您的登台环境中执行此迁移!
要求
安装 Prisma ORM 3.12.0 或更高版本
在您的项目目录中运行以下命令
$ npm install prisma@latest
$ npx prisma init --datasource-provider=mongodb
这应该创建以下文件
prisma/schema.prisma
:一个初始的 Prisma 模式.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 模式中。
$ npx prisma db pull
您应该看到您的 Prisma 模式位于 prisma/schema.prisma
中,其中填充了您的模型。
如果您看到以下错误:Error in connector: SCRAM failure: Authentication failed.
,请尝试在您的连接字符串的末尾添加 ?authSource=admin
并重试。
整理您的 Prisma 模式
从新内省的基于 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 模式仍然正确映射到底层的数据库集合和字段名称。
与 SQL 数据库不同,MongoDB 不明确了解数据之间的关系。这意味着 Prisma ORM 的内省无法为您推断这些关系。
我们通常建议使用 此文档 手动添加关系。但是,Prisma 1 存储外键的方式不同于 Prisma ORM 2 及更高版本预期外键的方式,因此,如果您想利用关系,您需要在添加关系之前更改数据库中外键的位置。
💡 下载 Prisma VSCode 扩展,以在您迁移 Prisma 模式时提供自动完成和有用的错误消息。
生成 Prisma Client
使用 Prisma 模式填充数据模式后,您现在已准备好生成一个 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.org.cn/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: '[email protected]',
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 的有用资源。
结论
我希望这篇简短的指南对您踏上正确的道路有所帮助。如果您有任何疑问或问题,请告诉我们。我们非常感谢您多年来的支持。