跳到主內容

如何在 Prisma ORM 中使用多個數據庫模式

警告

多個數據庫模式支援目前可透過 PostgreSQL、CockroachDB 和 SQL Server 聯結器獲得。

許多資料庫提供商允許你將資料庫表組織成命名組。你可以利用此功能使資料模型的邏輯結構更易於理解,或避免表之間的命名衝突。

在 PostgreSQL、CockroachDB 和 SQL Server 中,這些組被稱為模式(schemas)。我們將它們稱為資料庫模式,以區別於 Prisma ORM 自身的模式。

本指南將解釋如何

  • 在你的 Prisma Schema 中包含多個數據庫模式
  • 使用 Prisma Migrate 和 db push 將你的模式更改應用於資料庫
  • 內省具有多個數據庫模式的現有資料庫
  • 使用 Prisma Client 跨多個數據庫模式進行查詢

如何啟用 multiSchema 預覽特性

多模式支援目前處於預覽階段。要啟用 multiSchema 預覽特性,請將 multiSchema 特性標誌新增到 Prisma Schema 中 generator 塊的 previewFeatures 欄位。

schema.prisma
generator client {
provider = "prisma-client-js"
previewFeatures = ["multiSchema"]
}

datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}

如何在你的 Prisma Schema 中包含多個數據庫模式

要在你的 Prisma Schema 檔案中使用多個數據庫模式,請將資料庫模式的名稱新增到 datasource 塊中 schemas 欄位的數組裡。以下示例添加了一個 "base" 和一個 "transactional" 模式

schema.prisma
generator client {
provider = "prisma-client-js"
previewFeatures = ["multiSchema"]
}

datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
schemas = ["base", "transactional"]
}

你不需要更改你的連線字串。連線字串的 schema 值是 Prisma Client 連線並用於原始查詢的預設資料庫模式。所有其他 Prisma Client 查詢都使用你正在查詢的模型或列舉的模式。

要指定模型或列舉屬於特定的資料庫模式,請新增 @@schema 屬性,並將資料庫模式的名稱作為引數。在以下示例中,User 模型屬於 "base" 模式,而 Order 模型和 Size 列舉則屬於 "transactional" 模式

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

@@schema("base")
}

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

@@schema("transactional")
}

enum Size {
Small
Medium
Large

@@schema("transactional")
}

不同資料庫模式中同名的表

如果你的不同資料庫模式中存在同名表,你將需要在 Prisma Schema 中將表名對映到唯一的模型名稱。這可以避免你在 Prisma Client 中查詢模型時出現名稱衝突。

例如,考慮這樣一種情況:base 資料庫模式中的 config 表與 users 資料庫模式中的 config 表同名。為避免名稱衝突,請在你的 Prisma Schema 中為模型指定唯一的名稱(BaseConfigUserConfig),並使用 @@map 屬性將每個模型對映到相應的表名。

schema.prisma
model BaseConfig {
id Int @id

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

model UserConfig {
id Int @id

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

如何使用 Prisma Migrate 和 db push 應用你的模式更改

你可以使用 Prisma Migrate 或 db push 將更改應用於包含多個數據庫模式的 Prisma Schema。

例如,向上述部落格文章模型所在的 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: [id], references: [id])
user_id Int

@@schema("transactional")
}

enum Size {
Small
Medium
Large

@@schema("transactional")
}

然後,你可以將此模式更改應用於你的資料庫。例如,你可以使用 migrate dev 建立並應用你的模式更改作為一次遷移。

npx prisma migrate dev --name add_profile

請注意,如果你將模型或列舉從一個模式移動到另一個模式,Prisma ORM 將從源模式中刪除該模型或列舉,並在目標模式中建立一個新模型或列舉。

如何內省具有多個數據庫模式的現有資料庫

你可以像內省單個數據庫模式的資料庫一樣,使用 db pull 內省具有多個數據庫模式的現有資料庫。

npx prisma db pull

這會將你的 Prisma Schema 更新為與資料庫的當前狀態相匹配。

如果你的不同資料庫模式中存在同名表,Prisma ORM 將顯示一個驗證錯誤,指出衝突。要解決此問題,請使用 @map 屬性重新命名內省的模型

如何使用 Prisma Client 跨多個數據庫模式進行查詢

你可以在不更改 Prisma Client 查詢語法的情況下查詢多個數據庫模式中的模型。例如,以下查詢使用上述 Prisma Schema 查詢給定使用者的所有訂單

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

瞭解更多關於 multiSchema 預覽特性的資訊

要了解有關 multiSchema 預覽特性的未來計劃,或提供反饋,請參閱我們的 Github issue

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