跳到主要內容

概觀

Prisma Schema(或簡稱 schema)是您 Prisma ORM 設定的主要配置方法。它包含以下部分

  • 資料來源:指定 Prisma ORM 應連接的資料來源詳細資訊 (例如 PostgreSQL 資料庫)
  • 產生器:指定應根據資料模型產生的用戶端 (例如 Prisma Client)
  • 資料模型定義:指定您的應用程式 模型(每個資料來源的資料形狀)及其 關聯

它通常是一個名為 schema.prisma 的單一檔案(或多個具有 .prisma 副檔名的檔案),儲存在已定義但可自訂的 位置

注意

想要將您的 schema 分割成多個檔案嗎?多檔案 Prisma Schema 透過 Prisma ORM 5.15.0 及更高版本中的 prismaSchemaFolder 預覽功能支援。

請參閱 Prisma schema API 參考 ,以取得有關 schema 每個部分的詳細資訊。

每當調用 prisma 命令時,CLI 通常會從 schema 中讀取一些資訊,例如:

  • prisma generate:從 Prisma schema 讀取上述所有資訊,以產生正確的資料來源用戶端程式碼(例如 Prisma Client)。
  • prisma migrate dev:讀取資料來源和資料模型定義以建立新的遷移。

您也可以在 schema 內使用環境變數,以便在調用 CLI 命令時提供配置選項。

範例

以下是一個 Prisma Schema 的範例,它指定了

  • 一個資料來源 (PostgreSQL 或 MongoDB)
  • 一個產生器 (Prisma Client)
  • 一個具有兩個模型(帶有一個關聯)和一個 enum 的資料模型定義
  • 多個 原生資料類型屬性 (@db.VarChar(255), @db.ObjectId)
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}

generator client {
provider = "prisma-client-js"
}

model User {
id Int @id @default(autoincrement())
createdAt DateTime @default(now())
email String @unique
name String?
role Role @default(USER)
posts Post[]
}

model Post {
id Int @id @default(autoincrement())
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
published Boolean @default(false)
title String @db.VarChar(255)
author User? @relation(fields: [authorId], references: [id])
authorId Int?
}

enum Role {
USER
ADMIN
}

語法

Prisma Schema 檔案以 Prisma Schema Language (PSL) 編寫。請參閱資料來源產生器資料模型定義,當然還有 Prisma Schema API 參考頁面,以取得詳細資訊和範例。

VS Code

PSL 的語法突顯可透過 VS Code 擴充功能 取得(它還可以讓您自動格式化 Prisma schema 的內容,並以紅色波浪線指示語法錯誤)。進一步了解如何在您的編輯器中設定 Prisma ORM

GitHub

GitHub 上的 PSL 程式碼片段也可以透過使用 .prisma 副檔名或在 Markdown 中使用 prisma 註解圍欄程式碼區塊來呈現語法突顯

```prisma
model User {
id Int @id @default(autoincrement())
createdAt DateTime @default(now())
email String @unique
name String?
}
```

從 schema 存取環境變數

您可以使用環境變數,以便在調用 CLI 命令或執行 Prisma Client 查詢時提供配置選項。

直接在您的 schema 中硬編碼 URL 是可能的,但不建議這樣做,因為這會造成安全風險。在 schema 中使用環境變數可讓您將機密資訊保留在 schema 之外,進而提高 schema 的可攜性,讓您可以在不同的環境中使用它。

可以使用 env() 函數存取環境變數

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

您可以在以下位置使用 env() 函數

  • 資料來源網址
  • 產生器二進位目標

請參閱環境變數,以取得有關如何在開發期間使用 .env 檔案的更多資訊。

註解

Prisma Schema Language 中支援兩種註解類型

  • // comment:此註解是為了讀者的清晰度,並且不會出現在 schema 的抽象語法樹 (AST) 中。
  • /// comment:這些註解將在 schema 的抽象語法樹 (AST) 中顯示為 AST 節點的描述。然後,工具可以使用這些註解來提供額外資訊。所有註解都附加到下一個可用的節點 - 不支援自由浮動註解,並且不包含在 AST 中

以下是一些不同的範例

/// This comment will get attached to the `User` node in the AST
model User {
/// This comment will get attached to the `id` node in the AST
id Int @default(autoincrement())
// This comment is just for you
weight Float /// This comment gets attached to the `weight` node
}

// This comment is just for you. It will not
// show up in the AST.

/// This comment will get attached to the
/// Customer node.
model Customer {}

自動格式化

Prisma ORM 支援自動格式化 .prisma 檔案。有兩種格式化 .prisma 檔案的方法

沒有配置選項 - 格式化規則是固定的(類似於 Golang 的 gofmt,但不像 Javascript 的 prettier

格式化規則

配置區塊依其 = 符號對齊。

block _ {
key = "value"
key2 = 1
long_key = true
}

換行符號會重設區塊對齊

block _ {
key = "value"
key2 = 1
key10 = true

long_key = true
long_key_2 = true
}

欄位定義對齊成以 2 個或更多空格分隔的欄位

block _ {
id String @id
first_name LongNumeric @default
}

多行欄位屬性與其餘欄位屬性正確對齊

block _ {
id String @id
@default
first_name LongNumeric @default
}

換行符號會重設格式化規則

block _ {
id String @id
@default

first_name LongNumeric @default
}

區塊屬性排序到區塊的末尾

block _ {
key = "value"

@@attribute
}