概述
Prisma Schema(简称 *schema*)是配置 Prisma ORM 的主要方法。它包含以下几个部分:
- 数据源:指定 Prisma ORM 应连接的数据源详情(例如 PostgreSQL 数据库)
- 生成器:指定应基于数据模型生成哪些客户端(例如 Prisma Client)
- 数据模型定义:指定你的应用模型(每个数据源的数据形状)及其关系
它通常是一个名为 schema.prisma
的文件(或多个带有 .prisma
文件扩展名的文件),存储在一个已定义但可自定义的位置。如果你愿意,也可以将 Prisma schema 组织在多个文件中。
参阅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
)
- 关系型数据库
- MongoDB
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
}
datasource db {
provider = "mongodb"
url = env("DATABASE_URL")
}
generator client {
provider = "prisma-client-js"
}
model User {
id String @id @default(auto()) @map("_id") @db.ObjectId
createdAt DateTime @default(now())
email String @unique
name String?
role Role @default(USER)
posts Post[]
}
model Post {
id String @id @default(auto()) @map("_id") @db.ObjectId
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
published Boolean @default(false)
title String
author User? @relation(fields: [authorId], references: [id])
authorId String @db.ObjectId
}
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 来提高 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
文件:
- 运行
prisma format
命令。 - 安装Prisma VS Code 扩展并调用VS Code 格式化操作 - 手动或保存时进行。
没有配置选项 - 格式化规则是固定的(类似于 Golang 的 gofmt
,但不同于 Javascript 的 prettier
)
格式化规则
配置块按其 =
符号对齐
block _ {
key = "value"
key2 = 1
long_key = true
}
字段定义按列对齐,列之间用 2 个或更多空格分隔
block _ {
id String @id
first_name LongNumeric @default
}
空行会重置块对齐和格式化规则
block _ {
key = "value"
key2 = 1
key10 = true
long_key = true
long_key_2 = true
}
block _ {
id String @id
@default
first_name LongNumeric @default
}
多行字段属性与其余字段属性正确对齐
block _ {
id String @id
@default
first_name LongNumeric @default
}
块属性会排序到块的末尾
block _ {
key = "value"
@@attribute
}