跳至主要内容

多模式

概述

PostgreSQL、CockroachDB 和 SQL Server 允许你将数据库表组织到命名组中。这些组被称为 schema(模式),它们充当 namespace(命名空间),用于逻辑地分组表(例如,避免名称冲突或拥有更清晰的领域分离),并允许你定义跨表的外部键约束。为避免歧义,本页将这些命名空间称为 database schemas(数据库模式)

本页解释了如何

  • 在 Prisma 模式中包含多个数据库模式
  • 使用 Prisma Migrate 将你的模式更改应用到数据库
  • 内省(introspect)具有多个数据库模式的现有数据库
  • 使用 Prisma Client 跨多个数据库模式进行查询
注意

多模式功能仅支持 PostgreSQL、CockroachDB 和 SQL Server。它不适用于 SQLite 和 MySQL,因为这些数据库没有相同的 schemas as namespaces(作为命名空间的模式)概念。

如何在 Prisma 模式中包含多个数据库模式

要在 Prisma 模式文件中使用多个数据库模式,请将数据库模式的名称添加到 datasource 块中 schemas 字段的数组中。以下示例添加了一个 "base" 和一个 "shop" 模式

schema.prisma
generator client {
provider = "prisma-client"
output = "./generated"
}

datasource db {
provider = "postgresql"
schemas = ["base", "shop"]
}

你不需要更改连接字符串。连接字符串的 schema 值是 Prisma Client 连接并用于原始查询的默认数据库模式。所有其他 Prisma Client 查询都使用你正在查询的模型或枚举的模式。

要指定模型或枚举属于特定的数据库模式,请添加 @@schema 属性,并将数据库模式的名称作为参数。在以下示例中,User 模型属于 "base" 模式,而 Order 模型和 Size 枚举属于 "shop" 模式

schema.prisma
model User {
id Int @id
orders Order[]

@@schema("base")
}

model Order {
id Int @id
user User @relation(fields: [userId], references: [id])
userId Int

@@schema("shop")
}

enum Size {
Small
Medium
Large

@@schema("shop")
}

不同数据库模式中同名的表

如果你的不同数据库模式中存在同名表,你将需要将表名映射到 Prisma 模式中唯一的模型名。这样可以避免在 Prisma Client 中查询模型时出现名称冲突。

例如,考虑 base 数据库模式中的 Config 表与 users 数据库模式中的 Config 表同名的情况。为避免名称冲突,请在 Prisma 模式中为模型赋予唯一的名称(BaseConfigUserConfig),并使用 @@map 属性将每个模型映射到相应的表名

schema.prisma
model BaseConfig {
id Int @id

@@map("Config")
@@schema("base")
}

model UserConfig {
id Int @id

@@map("Config")
@@schema("users")
}

如何使用 Prisma Migrate 应用模式更改

你可以使用 Prisma Migrate(或 prisma db push)将更改应用到具有多个数据库模式的 Prisma 模式。

例如,在上面的 base 模式中添加一个 Profile 模型

schema.prisma
model User {
id Int @id
orders Order[]
profile Profile?

@@schema("base")
}

model Profile {
id Int @id @default(autoincrement())
bio String
user User @relation(fields: [userId], references: [id])
userId Int @unique

@@schema("base")
}

model Order {
id Int @id
user User @relation(fields: [userId], references: [id])
userId Int

@@schema("shop")
}

enum Size {
Small
Medium
Large

@@schema("shop")
}

然后你可以将此模式更改应用到你的数据库。例如,你可以使用 migrate dev 创建并将你的模式更改应用为迁移

npx prisma migrate dev --name add_profile

请注意,如果将模型或枚举从一个模式移动到另一个模式,Prisma ORM 将从源模式中删除该模型或枚举,并在目标模式中创建一个新模型或枚举。

如何内省(introspect)具有多个数据库模式的现有数据库

你可以像内省单个数据库模式一样内省具有多个数据库模式的现有数据库,使用 prisma db pull

npx prisma db pull

这会将你的 Prisma 模式更新为与数据库当前状态匹配。

如果你的不同数据库模式中存在同名表,Prisma ORM 将显示一个验证错误,指出冲突。要解决此问题,请使用 @map 属性重命名内省的模型

如何使用 Prisma Client 跨多个数据库模式进行查询

你可以在多个数据库模式中查询模型,无需更改 Prisma Client 查询语法。例如,以下查询使用上面的 Prisma 模式查找给定用户的所有订单

const orders = await prisma.order.findMany({
where: {
user: {
id: 42,
},
},
})

外部管理表

有时,你可能不希望 Prisma ORM 管理特定的表,例如由其他团队或服务处理的表(例如 Auth0 或 Clerk 表)。在这种情况下,你可以在 Prisma 配置文件中使用 tables.external 配置选项将这些表标记为外部管理表。了解更多关于外部管理表的信息。

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