跳到主要内容

概览

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() 函数

  • 一个数据源 url
  • 生成器二进制目标

有关如何在开发期间使用 .env 文件的更多信息,请参阅环境变量

注释

Prisma Schema Language 中支持两种类型的注释

  • // comment:此注释是为了读者的清晰度,并且不存在于 schema 的抽象语法树 (AST) 中。
  • /// comment:这些注释将作为 AST 节点的描述显示在 schema 的抽象语法树 (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
}