跳至主要内容

概述

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
}