不支援的資料庫功能 (Prisma Schema)
Prisma ORM 支援的資料庫並非所有資料庫函式和功能都有對應的 Prisma Schema Language 等價物。請參閱資料庫功能矩陣以獲取受支援功能的完整列表。
原生資料庫函式
Prisma Schema Language 支援多種函式,您可以使用它們來設定欄位的預設值。以下示例使用 Prisma ORM 級別的 uuid() 函式來設定 id 欄位的值
model Post {
id String @id @default(uuid())
}
但是,您也可以使用原生資料庫函式透過dbgenerated(...)在關係型資料庫中定義預設值(MongoDB 沒有資料庫級函式的概念)。以下示例使用 PostgreSQL 的 gen_random_uuid() 函式填充 id 欄位
model User {
id String @id @default(dbgenerated("gen_random_uuid()")) @db.Uuid
}
何時使用資料庫級函式
使用資料庫級函式有兩個原因
-
沒有等效的 Prisma ORM 函式(例如,PostgreSQL 中的
gen_random_bytes)。 -
您不能或不想依賴僅在 Prisma ORM 級別實現且未在資料庫中體現的函式,例如
uuid()和cuid()。考慮以下示例,它將
id欄位設定為隨機生成的UUIDmodel Post {
id String @id @default(uuid())
}只有當您使用 Prisma Client 建立
Post時,才會生成 UUID。如果您透過其他方式建立帖子,例如使用純 SQL 編寫的批次匯入指令碼,則必須自行生成 UUID。
為原生資料庫函式啟用 PostgreSQL 擴充套件
在 PostgreSQL 中,一些原生資料庫函式是擴充套件的一部分。例如,在 PostgreSQL 12.13 及更早版本中,gen_random_uuid() 函式是pgcrypto擴充套件的一部分。
要使用 PostgreSQL 擴充套件,您必須首先將其安裝在資料庫伺服器的檔案系統上。
在 Prisma ORM 4.5.0 及更高版本中,您可以透過在 Prisma Schema 中使用postgresqlExtensions 預覽功能來宣告從而啟用該擴充套件。
generator client {
provider = "prisma-client-js"
previewFeatures = ["postgresqlExtensions"]
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
extensions = [pgcrypto]
}
在早期版本的 Prisma ORM 中,您必須改為執行 SQL 命令來啟用該擴充套件。
CREATE EXTENSION IF NOT EXISTS pgcrypto;
如果您的專案使用Prisma Migrate,則必須將擴充套件作為遷移的一部分進行安裝。不要手動安裝擴充套件,因為影子資料庫也需要它。
如果擴充套件不可用,Prisma Migrate 將返回以下錯誤
Migration `20210221102106_failed_migration` failed to apply cleanly to a temporary database.
Database error: Error querying the database: db error: ERROR: type "pgcrypto" does not exist
不支援的欄位型別
關係型資料庫的某些資料庫型別,例如 polygon 或 geometry,沒有對應的 Prisma Schema Language 等價物。使用Unsupported欄位型別在 Prisma Schema 中表示該欄位
model Star {
id Int @id @default(autoincrement())
position Unsupported("circle")? @default(dbgenerated("'<(10,4),11>'::circle"))
}
prisma migrate dev 和 prisma db push 命令都將在資料庫中建立一個型別為 circle 的 position 欄位。但是,該欄位將無法在生成的 Prisma Client 中使用。
不支援的資料庫功能
某些功能,例如 SQL 檢視或部分索引,無法在 Prisma Schema 中表示。如果您的專案使用Prisma Migrate,則必須將不支援的功能作為遷移的一部分包含。