写第一个 schema.prisma:datasource、generator、model
schema.prisma 三件套
初始化完成后,打开 prisma/schema.prisma,你会看到一个空白模板。一份完整的 Prisma Schema 由三个部分组成:
- datasource — 告诉 Prisma 连哪个数据库、用什么 provider
- generator — 告诉 Prisma 生成什么(通常是 Prisma Client)
- model — 定义你的数据模型(对应数据库里的表或集合)
完整示例
下面写一个简单的博客场景作为示例:用户(User)和文章(Post)。用户可以发表多篇文章,每篇文章属于一个用户。
// prisma/schema.prisma
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
generator client {
provider = "prisma-client-js"
}
model User {
id Int @id @default(autoincrement())
email String @unique
name String?
createdAt DateTime @default(now())
posts Post[]
}
model Post {
id Int @id @default(autoincrement())
title String
content String?
published Boolean @default(false)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
author User? @relation(fields: [authorId], references: [id])
authorId Int?
}
逐段解释
datasource
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
provider指定数据库类型——支持postgresql、mysql、sqlite、mongodb、sqlserver、cockroachdburl通过env()函数读取.env文件里的环境变量,避免把数据库密码硬编码进 Schemadb是 datasource 的名字,可以随便起,但一个 Schema 里只能有一个 datasource
generator
generator client {
provider = "prisma-client-js"
}
- 指定要生成的客户端类型,
prisma-client-js就是标准的 Node.js/TypeScript 查询客户端 - 一个 Schema 里可以有多个 generator(比如同时生成 REST API 脚手架),但绝大多数项目只需要这一个
model User
model User {
id Int @id @default(autoincrement())
email String @unique
name String?
createdAt DateTime @default(now())
posts Post[]
}
model对应关系数据库里的一张表(或 MongoDB 的一个 collection)- 每一行是一个字段声明:
字段名 类型 [属性] - 字段类型:
Int、String、Boolean、DateTime、Float、Json、Bytes等 ?后缀表示这个字段可空(nullable),没有?就是必填@id标记主键,@default(autoincrement())表示自增@unique标记唯一约束Post[]是一个 Prisma 级别的关联字段——表示这个 User 可以有多篇 Post。它不在数据库里生成外键,只是让 Prisma Client 的 include 查询工作得更顺畅
model Post
model Post {
author User? @relation(fields: [authorId], references: [id])
authorId Int?
}
@relation定义两个模型之间的关系。这里说的是:Post 的authorId外键字段引用 User 的id字段authorId Int?对应的就是数据库里真正的外键列,@relation只是告诉 Prisma Client 这两个模型怎么关联@updatedAt是 Prisma 特殊属性——每次更新这行记录时,这个字段会自动设为当前时间
下一步
Schema 写好后,你需要执行 生成 Client 的 prisma generate 来生成 Prisma Client,然后就能在代码里用类型安全的查询 API 了。