命名约束升级路径
升级到 Prisma ORM 3 后,约束和索引名称的默认命名约定将更改,并且对于支持它们的数据库,主键和外键名称现在将成为模式的一部分。因此,现有 Prisma 模式的含义将发生变化。
在继续发展模式和数据库之前,您应该决定将来在项目中使用哪些约束和索引名称。
您可以保持数据库中现有的名称,也可以切换为使用 Prisma ORM 生成的名称,这些名称遵循新的命名约定。
本页介绍了升级到 Prisma ORM 3 后需要执行的手动升级步骤。您可以选择以下两种选项之一:
- 选项 1: 我希望保留现有的约束和索引名称
- 选项 2: 我希望使用 Prisma ORM 的默认约束和索引名称
选项 1:我希望保留现有的约束和索引名称
如果您希望数据库保持不变并保留约束和索引的现有名称,则需要将它们拉入模式中,以便 Prisma ORM 能够识别它们。
保留现有名称的原因可能包括:
- 您必须遵循的命名约定
- 其他工具依赖于这些名称
- 个人偏好
要保留现有名称,请针对目标环境运行 prisma db pull。这将导致所有不符合 Prisma ORM 约束和索引名称命名约定的名称作为 map 参数被拉入模式中的相应属性。
-
示例模式
model User {
id Int @id @default(autoincrement())
name String @unique
posts Post[]
}
model Post {
id Int @id @default(autoincrement())
title String
authorName String @default("Anonymous")
author User? @relation(fields: [authorName], references: [name])
} -
内省您的开发数据库,用底层数据库中不符合 Prisma ORM 命名约定的约束和索引名称填充 Prisma 模式。
npx prisma db pull在此示例中,突出显示的约束不符合 Prisma ORM 的默认命名约定,现在包含
map属性字段model User {
id Int @id(map: "Custom_Constraint_Name") @default(autoincrement())
name String @unique
posts Post[]
}
model Post {
id Int @id @default(autoincrement())
title String
authorName String @default("Anonymous")
author User? @relation(fields: [authorName], references: [name], map: "Custom_Foreign_Key_Constraint")
}
选项 2:我希望使用 Prisma ORM 的默认约束和索引名称
如果您希望保持 Prisma Schema 整洁,并且没有理由阻止您重命名数据库中的约束和索引,那么您可以创建迁移来更新名称。
运行 prisma migrate dev 以创建将约束名称更新为 Prisma ORM 默认值的迁移。
之后,如果您有生产环境,请不要忘记对生产环境运行 prisma migrate deploy 以更新那里的名称。下面的模式没有明确指定约束或索引名称,因此 Prisma ORM 将推断它们。
-
示例模式
model User {
name String @id //inferred as User_pkey
posts Post[]
}
model Post {
id Int @id @default(autoincrement()) //inferred as Post_pkey
authorName String @default("Anonymous")
author User? @relation(fields: [authorName], references: [name]) //inferred as Post_authorName_fkey
} -
运行
prisma migrate dev命令以生成新的迁移npx prisma migrate dev此迁移会重命名当前不符合 Prisma ORM 命名约定的任何约束。
-
运行
prisma migrate deploy命令以将迁移应用到生产环境npx prisma migrate deploy
处理同一应用程序使用多个数据库环境的情况
检查您的环境是否使用相同的名称
由于 Prisma ORM 过去没有提供明确定义约束或索引名称的方法,您可能会遇到不同数据库环境具有不同约束或索引名称的情况。
为了检测这种情况:
- 创建当前
schema.prisma文件的备份。 - 通过使用
--schema选项将结果保存到各自的单独文件中,对每个数据库环境运行prisma db pull。请参阅参考资料
然后,您可以手动检查这两个文件,或在 IDE 或终端中使用 diff 工具。如果约束名称存在差异,则您的生产环境和本地环境不同步,应进行对齐。
在以下示例中,Post 模型在生产环境中有一个自定义名称的外键约束,与开发环境不匹配。
开发环境:
model Post {
id Int @id @default(autoincrement())
title String
authorName String @default("Anonymous")
author User? @relation(fields: [authorName], references: [name], map: "Custom_Foreign_Key_Constraint")
}
生产环境:
model Post {
id Int @id @default(autoincrement())
title String
authorName String @default("Anonymous")
author User? @relation(fields: [authorName], references: [name], map: "Custom_Production_Name")
}
如果您的环境的约束或索引名称不同,请对齐您的环境
如果您的环境中的名称不同,最安全的选项是将您的开发环境与生产环境中的名称对齐。这确保了您的生产数据库无需执行任何更改。
为了实现这一点:
- 对您的生产环境运行
prisma db pull以拉取约束和索引名称 - 切换到开发环境并运行
prisma migrate dev以创建新的迁移。您可以将该迁移命名为migration-to-sync-names - 切换到生产环境,并运行
prisma migrate resolve --applied migration-to-sync-names以将该迁移标记为已应用于生产环境
您的迁移历史现在包含了一个迁移,以确保您启动的任何新环境都包含与生产数据库相同的名称。Prisma ORM 知道不会将此迁移应用于生产环境,因为您已将其标记为已应用。
您的环境现在已同步,您可以继续 迁移用户的升级路径。这些允许您选择未来的命名方案。