如何在 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 欄位。
generator client {
provider = "prisma-client-js"
previewFeatures = ["multiSchema"]
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
如何在你的 Prisma Schema 中包含多個數據庫模式
要在你的 Prisma Schema 檔案中使用多個數據庫模式,請將資料庫模式的名稱新增到 datasource 塊中 schemas 欄位的數組裡。以下示例添加了一個 "base" 和一個 "transactional" 模式
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" 模式
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 中為模型指定唯一的名稱(BaseConfig 和 UserConfig),並使用 @@map 屬性將每個模型對映到相應的表名。
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 模型
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。