跳到主要内容

命名约束升级路径

在升级到 Prisma ORM 3 后,约束和索引名称的默认命名约定将会改变,并且你的主键和外键名称现在将成为支持它们的数据库的 schema 的一部分。因此,你现有 Prisma schema 的含义将会改变。

在你继续演进你的 schema 和数据库之前,你应该决定在未来你的项目中使用哪种约束和索引名称。

你可以保留数据库中已有的名称,或者你可以切换到使用 Prisma ORM 生成的名称,这些名称遵循新的命名约定。

此页面描述了在升级到 Prisma ORM 3 后你需要执行的手动升级步骤。你可以选择以下两个选项之一

选项 1:我想保留我现有的约束和索引名称

如果你想保持你的数据库不变,并保留现有约束和索引的名称,你需要将它们拉取到你的 schema 中,以便 Prisma ORM 能够感知到它们。

保留现有名称的原因可能是

  • 你必须遵循的命名约定
  • 其他工具依赖于这些名称
  • 个人偏好

要保留现有名称,请针对目标环境运行 prisma db pull。这将导致所有不符合 Prisma ORM 约束和索引名称命名约定的名称,作为 map 参数拉取到它们各自属性的 schema 中。

  1. 示例 schema

    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])
    }
  2. 内省你的开发数据库,以使用底层数据库中不符合 Prisma ORM 命名约定的约束和索引名称填充 Prisma schema

    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 以更新那里的名称。下面的 schema 没有明确拼写出约束或索引名称,因此 Prisma ORM 将推断它们。

  1. 示例 schema

    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
    }
  2. 运行 prisma migrate dev 命令以生成新的迁移

    npx prisma migrate dev

    此迁移会重命名任何当前不遵循 Prisma ORM 命名约定的约束。

  3. 运行 prisma migrate deploy 命令以将迁移应用到你的生产环境

    npx prisma migrate deploy

处理同一应用程序使用多个数据库环境的情况

检查你的环境是否使用相同的名称

由于 Prisma ORM 过去没有提供显式定义约束或索引名称的方法,你可能会遇到不同的数据库环境具有不同的约束或索引名称的情况。

为了检测到这一点

  • 创建当前 schema.prisma 文件的备份。
  • 针对每个数据库环境运行 prisma db pull,通过使用 --schema 选项将结果保存到它们各自单独的文件中。请参阅参考

然后你可以手动检查这两个文件,或者在你的 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 知道不要将此迁移应用到生产环境,因为你已经将其标记为已应用。

你的环境现在已同步,你可以继续执行 migrate 用户的升级路径。这些路径让你选择你未来的命名方案。