跳到主要內容

檢視

警告

對檢視的支援目前是一個非常早期的預覽功能。您可以使用 view 關鍵字將檢視新增到 Prisma schema,或使用 db pull 內省資料庫 schema 中的檢視。您目前無法使用 Prisma Migrate 和 db push 將 schema 中的檢視應用於資料庫,除非使用 --create-only 標誌手動將更改新增到遷移檔案中。

有關此功能進度的更新,請關注我們的 GitHub issue

資料庫檢視允許您命名和儲存查詢。在關係資料庫中,檢視是儲存的 SQL 查詢,可能包含多個表中的列或計算值(如聚合)。在 MongoDB 中,檢視是可查詢的物件,其內容由其他集合上的聚合管道定義。

views 預覽功能允許您使用 view 關鍵字在 Prisma schema 中表示檢視。要在 Prisma ORM 中使用檢視,請遵循以下步驟:

啟用 views 預覽功能

對檢視的支援目前處於早期預覽階段。要啟用 views 預覽功能,請將 views 功能標誌新增到 Prisma Schema 中 generator 塊的 previewFeatures 欄位中

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

請在我們的專門的 views 預覽功能反饋 issue中留下對此預覽功能的反饋。

在底層資料庫中建立檢視

目前,您無法使用 Prisma Migrate 和 db push 將您在 Prisma schema 中定義的檢視應用於資料庫。相反,您必須首先在底層資料庫中建立檢視,無論是手動建立還是作為遷移的一部分

例如,考慮以下 Prisma schema,其中包含一個 User 模型和一個相關的 Profile 模型

model User {
id Int @id @default(autoincrement())
email String @unique
name String?
profile Profile?
}

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

接下來,在底層資料庫中建立一個 UserInfo 檢視,它結合了 User 模型的 emailname 欄位以及 Profile 模型的 bio 欄位。

對於關係資料庫,建立此檢視的 SQL 語句是

CREATE VIEW "UserInfo" AS
SELECT u.id, email, name, bio
FROM "User" u
LEFT JOIN "Profile" p ON u.id = p."userId";

對於 MongoDB,您可以使用以下命令建立檢視

db.createView('UserInfo', 'User', [
{
$lookup: {
from: 'Profile',
localField: '_id',
foreignField: 'userId',
as: 'ProfileData',
},
},
{
$project: {
_id: 1,
email: 1,
name: 1,
bio: '$ProfileData.bio',
},
},
{ $unwind: '$bio' },
])

將檢視與 Prisma Migrate 和 db push 配合使用

如果您使用 Prisma Migrate 或 db push 應用對 Prisma schema 的更改,Prisma ORM 不會建立或執行任何與檢視相關的 SQL。

要在遷移中包含檢視,請執行 migrate dev --create-only,然後手動將檢視的 SQL 新增到您的遷移檔案中。或者,您也可以在資料庫中手動建立檢視。

將檢視新增到您的 Prisma schema

要將檢視新增到您的 Prisma schema,請使用 view 關鍵字。

您可以如下在 Prisma schema 中表示上面示例中的 UserInfo 檢視

view UserInfo {
id Int @unique
email String
name String
bio String
}

手動編寫

一個 view 塊由兩部分組成

  • view 塊定義
  • 檢視的欄位定義

這兩部分允許您定義在生成的 Prisma Client 中檢視的名稱以及檢視查詢結果中存在的列。

定義 view

要定義上面示例中的 UserInfo 檢視,首先使用 view 關鍵字在您的 schema 中定義一個名為 UserInfoview

view UserInfo {
// Fields
}

定義欄位

檢視的屬性稱為欄位,它們包括

  • 欄位名稱
  • 欄位型別

UserInfo 示例檢視的欄位可以定義如下

view UserInfo {
id Int @unique
email String
name String
bio String
}

view 塊的每個欄位都代表底層資料庫中檢視查詢結果中的一列。

使用內省

警告

目前僅適用於 PostgreSQL、MySQL、SQL Server 和 CockroachDB。

如果您在資料庫中定義了一個或多個現有檢視,內省將自動在您的 Prisma schema 中生成表示這些檢視的 view 塊。

假設示例 UserInfo 檢視存在於您的底層資料庫中,執行以下命令將在您的 Prisma schema 中生成一個表示該檢視的 view

npx prisma db pull

生成的 view 塊將定義如下

/// The underlying view does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client.
view UserInfo {
id Int?
email String?
name String?
bio String?

@@ignore
}

view 塊最初生成時帶有一個 @@ignore 屬性,因為沒有定義唯一識別符號(這是目前檢視預覽功能的限制)。

警告

請注意,目前 db pull 僅在使用 PostgreSQL、MySQL、SQL Server 或 CockroachDB 時內省您的 schema 中的檢視。對其他資料庫提供商的支援將擴充套件此工作流。

向內省檢視新增唯一識別符號

為了能夠在 Prisma Client 中使用內省檢視,您需要選擇並定義一個或多個欄位作為唯一識別符號。

在上述檢視的情況下,id 列指的是底層 User 表中唯一可標識的欄位,因此該欄位也可以用作 view 塊中唯一可標識的欄位。

為了使此 view 塊有效,您需要

  • id 欄位中移除可選標誌 ?
  • @unique 屬性新增到 id 欄位
  • 移除 @@ignore 屬性
  • 移除生成的關於無效檢視的警告註釋
/// The underlying view does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client.
view UserInfo {
id Int?
id Int @unique
email String?
name String?
bio String?

@@ignore
}

重新內省資料庫時,您對檢視定義的任何自定義更改都將保留。

views 目錄

內省一個或多個現有檢視的資料庫還將在您的 prisma 目錄中建立一個新的 views 目錄(從 Prisma 4.12.0 版本開始)。此目錄將包含一個以您的資料庫 schema 命名的子目錄,其中包含該 schema 中每個內省檢視的 .sql 檔案。每個檔案都將以單個檢視命名,幷包含相關檢視定義的查詢。

例如,在使用上述模型內省具有預設 public schema 的資料庫後,您將發現建立了一個 prisma/views/public/UserInfo.sql 檔案,其內容如下

SELECT
u.id,
u.email,
u.name,
p.bio
FROM
(
"User" u
LEFT JOIN "Profile" p ON ((u.id = p."userId"))
);

限制

唯一識別符號

目前,Prisma ORM 將檢視視為模型。這意味著檢視需要至少有一個唯一識別符號,可以由以下任何一種表示

  • 使用@unique表示的唯一約束
  • 使用@@unique表示的複合唯一約束
  • @id 欄位
  • 使用@@id表示的複合識別符號

在關係資料庫中,檢視的唯一識別符號可以定義為一個欄位上的 @unique 屬性,或多個欄位上的 @@unique 屬性。如果可能,最好使用 @unique@@unique 約束而不是 @id@@id 欄位。

然而,在 MongoDB 中,唯一識別符號必須是一個 @id 屬性,透過 @map("_id") 對映到底層資料庫中的 _id 欄位。

在上面的示例中,id 欄位具有 @unique 屬性。如果底層 User 表中的另一列被定義為唯一識別符號並在檢視的查詢結果中可用,則可以使用該列作為唯一識別符號。

內省

目前,檢視的內省僅適用於 PostgreSQL、MySQL、SQL Server 和 CockroachDB。如果您正在使用其他資料庫提供商,您的檢視必須手動新增。

這是一個臨時限制,內省支援將擴充套件到其他受支援的資料來源提供商。

在 Prisma Client 中查詢檢視

您可以在 Prisma Client 中像查詢模型一樣查詢檢視。例如,以下查詢在上面定義的 UserInfo 檢視中查詢所有 name'Alice' 的使用者。

const userinfo = await prisma.userInfo.findMany({
where: {
name: 'Alice',
},
})

目前,Prisma Client 允許您在底層資料庫允許的情況下更新檢視,而無需任何額外的驗證。

特殊型別的檢視

本節介紹如何在資料庫中將 Prisma ORM 與可更新檢視和物化檢視一起使用。

可更新檢視

一些資料庫支援可更新檢視(例如 PostgreSQLMySQLSQL Server)。可更新檢視允許您建立、更新或刪除條目。

目前 Prisma ORM 將所有 view 都視為可更新檢視。如果底層資料庫支援檢視的此功能,則操作應該成功。如果檢視未標記為可更新,資料庫將返回錯誤,Prisma Client 將丟擲此錯誤。

將來,Prisma Client 可能會支援將單個檢視標記為可更新或不可更新。請在我們的views 反饋 issue中評論您的用例。

物化檢視

一些資料庫支援物化檢視,例如 PostgreSQLCockroachDBMongoDBSQL Server(其中它們被稱為“索引檢視”)。

物化檢視持久化檢視查詢的結果以實現更快訪問,並且僅在需要時更新。

目前,Prisma ORM 不支援物化檢視。然而,當您手動建立檢視時,您也可以使用底層資料庫中相應的命令建立物化檢視。然後,您可以使用 Prisma Client 的型別化 SQL 功能來執行命令並手動重新整理檢視。

將來 Prisma Client 可能會支援將單個檢視標記為物化檢視,並新增 Prisma Client 方法來重新整理物化檢視。請在我們的views 反饋 issue中評論您的用例。

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