Prisma
Prisma 速查表
Prisma 是一个开源的数据库工具,可以方便地连接数据库、生成客户端、操作数据库等。是 Node.js 和 TypeScript 的首选 ORM。ORM 是 Object Relational Mapping 的缩写,意思是对象关系映射,是一种程序设计技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。ORM 通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。
1. 安装
npm install prisma
2. 初始化
npx prisma init
3. 生成客户端
npx prisma generate
4. 生成数据库
npx prisma migrate dev --name init
启动 Studio
Prisma Studio 是一个可视化的数据库管理工具,可以方便地查看、编辑数据库中的数据。
npx prisma studio
prisma.schema
用于定义数据库模型
1. 数据源
选择数据库的种类,以及连接数据库的 URL
datasource db {
provider = "sqlite"
url = "file:./dev.db"
}
此外还支持 mysql
、postgresql
、sqlserver
等数据库如下:
datasource db {
provider = "mysql"
url = env("DATABASE_URL")
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
datasource db {
provider = "sqlserver"
url = env("DATABASE_URL")
}
2. 模型
定义数据库中的表
model User {
id Int @id @default(autoincrement())
email String @unique
name String?
posts Post[]
}
model Post {
id Int @id @default(autoincrement())
title String
content String?
published Boolean @default(false)
author User @relation(fields: [authorId], references: [id])
authorId Int
}
@id
表示主键,@default(autoincrement())
表示自增
@unique
表示唯一
@relation
表示外键
此外,还支持 @map
、@default
、@updatedAt
、@createdAt
、@ignore
、@comment
、@db
、@index
等,分别表示数据库中的字段名、默认值、更新时间、创建时间、忽略、注释、数据库名、索引等。
详细的字段类型可以参考 Prisma Schema Reference (opens in a new tab)。
常见数据类型
1. String
model User {
id Int @id @default(autoincrement())
email String @unique
name String?
}
2. Int
model User {
id Int @id @default(autoincrement())
email String @unique
age Int?
}
3. Float
model User {
id Int @id @default(autoincrement())
email String @unique
height Float?
}
4. Boolean
model User {
id Int @id @default(autoincrement())
email String @unique
isMale Boolean?
}
5. DateTime
model User {
id Int @id @default(autoincrement())
email String @unique
createdAt DateTime @default(now())
}
6. Json
model User {
id Int @id @default(autoincrement())
email String @unique
info Json?
}
7. Enum
enum Role {
USER
ADMIN
}
model User {
id Int @id @default(autoincrement())
email String @unique
role Role @default(USER)
}
更多的数据类型可以参考 Prisma Schema Reference (opens in a new tab)。
3. 关系
可以定义两个模型之间的关系,包括一对一、一对多、多对多等。
model User {
id Int @id @default(autoincrement())
email String @unique
name String?
// posts Post[] 指向 Post 模型中的 author 字段
posts Post[]
}
model Post {
id Int @id @default(autoincrement())
title String
content String?
published Boolean @default(false)
author User @relation(fields: [authorId], references: [id])
authorId Int
}
在这里,User
模型中的 posts
字段表示一对多的关系,Post
模型中的 author
字段表示一对一的关系。
更多的关系可以参考 Prisma Schema Reference (opens in a new tab)。
prisma.client
用于操作数据库
1. 连接数据库
import { PrismaClient } from '@prisma/client'
const prisma = new PrismaClient()
2. 创建数据
const user = await prisma.user.create({
data: {
email: '',
name: '',
},
})
3. 查询数据
const users = await prisma.user.findMany()
4. 更新数据
const user = await prisma.user.update({
where: {
id: 1,
},
data: {
name: 'new name',
},
})
5. 删除数据
const user = await prisma.user.delete({
where: {
id: 1,
},
})
6. 关联查询
const user = await prisma.user.findUnique({
where: {
id: 1,
},
include: {
posts: true,
},
})
这将返回一个 User
对象,其中包含 posts
字段,该字段是一个 Post
对象的数组。如:
{
"id": 1,
"email": "",
"name": "new name",
"posts": [
{
"id": 1,
"title": "title",
"content": "content",
"published": false,
"authorId": 1
}
]
}
7. 事务
const result = await prisma.$transaction([
prisma.user.create({
data: {
email: '',
name: '',
},
}),
prisma.post.create({
data: {
title: '',
content: '',
published: false,
authorId: 1,
},
}),
])
表示同时创建 User
和 Post
两个模型的数据。
seed.ts
用于初始化数据库
import { PrismaClient } from '@prisma/client'
const prisma = new PrismaClient()
async function main() {
await prisma.user.create({
data: {
email: 'example@w.com',
name: 'example',
},
})
}
main()
.catch((e) => {
throw e
})
.finally(async () => {
await prisma.$disconnect()
})