跳到主要內容

不支援的資料庫功能

並非所有 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)。

  • 您不能或不想依賴 uuid()cuid() 等函數,這些函數僅在 Prisma ORM 層級實作,且不會在資料庫中顯現。

    考慮以下範例,它將 id 欄位設定為隨機產生的 UUID

    model 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 預覽功能 宣告擴充功能來啟用它

schema.prisma
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

不支援的欄位類型

某些關聯式資料庫的資料庫類型(例如 polygongeometry)在 Prisma Schema Language 中沒有對應項目。使用 Unsupported 欄位類型來表示 Prisma schema 中的欄位

model Star {
id Int @id @default(autoincrement())
position Unsupported("circle")? @default(dbgenerated("'<(10,4),11>'::circle"))
}

prisma migrate devprisma db push 命令都會在資料庫中建立類型為 circleposition 欄位。但是,該欄位在產生的 Prisma Client 中將不可用。

不支援的資料庫功能

某些功能(例如 SQL 視圖或部分索引)無法在 Prisma schema 中表示。如果您的專案使用 Prisma Migrate,您必須將不支援的功能包含為遷移的一部分