Schema 结构详解:datasource、generator、model、enum
Schema 文件本质
schema.prisma 是一份用 Prisma Schema Language(PSL) 写的声明式配置文件。整个文件由三种顶层声明组成:
| 声明 | 作用 | 一个 Schema 里可以有几个 |
|---|---|---|
datasource | 指定连接哪个数据库 | 最多 1 个 |
generator | 指定要生成什么客户端 | 可以多个 |
model / enum | 定义数据模型 | 可以多个 |
文件位置查找顺序
当你执行 prisma generate、prisma migrate dev 或 prisma studio 等命令时,Prisma CLI 会按以下顺序定位 Schema 文件:
- 命令行
--schema参数指定的路径 package.json里prisma.schema字段配置的路径(v2.7+ 支持)- 项目根目录下的
prisma/schema.prisma - 项目根目录下的
schema.prisma
推荐把 Schema 放在默认的 prisma/schema.prisma,这样你不需要额外配置。
datasource
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
// directUrl = env("DIRECT_URL") // 生产环境可指定一个直接连接串
}
db是 datasource 的标识名,可以任意取provider是数据库类型,合法值:postgresql、mysql、sqlite、mongodb、sqlserver、cockroachdburl是连接字符串,通常通过env()从环境变量读取;也可以硬编码(不推荐)directUrl可选,生产环境场景下可以指定绕过连接池的直接连接串(配合 Accelerate 使用)
generator
generator client {
provider = "prisma-client-js"
// binaryTargets = ["native", "debian-openssl-1.1.x"] // 多平台编译
// output = "../custom-output-path" // 自定义生成位置
}
provider决定生成什么客户端。绝大多数项目用prisma-client-jsbinaryTargets用于多平台部署场景(Docker、Linux ARM 等),让 Prisma 预编译对应平台的引擎output可自定义生成目录,默认是node_modules/.prisma/client
一个 Schema 里可以有多个 generator,比如同时生成 JS Client 和 REST API generator。
model 与 enum
这两个是数据定义的主体,放在 datasource 和 generator 之后:
enum Role {
USER
ADMIN
MODERATOR
}
model User {
id Int @id @default(autoincrement())
role Role @default(USER)
}
model对应数据库里的表(关系型)或集合(MongoDB)enum定义枚举类型,字段可以引用它- 字段声明格式:
字段名 类型 [属性]
环境变量
Schema 里可以用 env("VAR_NAME") 读取 .env 文件里的环境变量。推荐做法:
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
.env 文件:
DATABASE_URL="postgresql://postgres:password@localhost:5432/mydb"
Prisma CLI 在执行命令时,会自动从 Schema 文件所在目录开始往上查找 .env 文件并加载。
注释
Schema 支持两种注释:
/// 这是文档注释,会附加到下一个 AST 节点上
model User {
/// 用户唯一 ID
id Int @id
// 普通注释,仅供阅读,不进入 AST
email String
}
///三斜杠注释会进入抽象语法树,编辑器和工具可以读取//单斜杠注释仅供人类阅读,不进入 AST
自动格式化
Prisma 提供了内置的格式化工具,没有配置选项,规则类似 Go 的 gofmt:
npx prisma format
VS Code 扩展也支持保存时自动格式化。格式化规则是固定的:
- 配置块按
=对齐 - 字段定义按类型和属性列对齐
- 块属性(
@@map、@@unique)移到块末尾
下一步
配置块看完了,接下来重点在 model 的字段定义和属性上——参见 字段类型与属性。