Prisma Schema概览
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 的可移植性,因为它允许你在不同的环境中使用。
可以使用 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
}