来源:Node.js

Prisma

Prisma是一个更现代化的数据库工具套件,用于简化和改进应用程序与数据库之间的交互

Prisma提供了一个类型安全(使用TypeScript)的查询构建器和一个强大的 ORM(对象关系映射)层,能以声明性的方式操作数据库

Prisma支持多种主流数据库,包括PostgreSQL、MySQL和SQLite,通过生成标准的数据库模型来与这些数据库进行交互

Prisma可以定义数据库模型并生成类型安全的查询构建器,这些构建器提供了一套直观的方法来增删改查数据库

Prisma还提供了数据库迁移工具,能自动创建、应用迁移脚本,方便变更数据库模式

Prisma使用了先进的查询引擎和数据加载技术从而提高数据库访问性能,也支持高级查询功能(例如关联查询和聚合查询),还会自动优化查询以提供最佳的性能

安装

1
2
$ pnpm install -g prisma  # 安装包
$ prisma init --datasource-provider mysql # 初始化项目

项目结构:

使用

连接数据库

修改.env文件的DATABASE_URL配置

1
DATABASE_URL="mysql://账号:密码@主机:端口/数据库名"

创建表

在prisma/schema.prisma中写入内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
model Post {
id Int @id @default(autoincrement()) // id 自增整数
title String // 标题 字符串
publish Boolean @default(false) // 是否已发布 布尔 默认false
author User @relation(fields: [authorId], references: [id]) // 作者 关联用户表 关联关系为authorId-user.id
authorId Int // 作者id 整数
}

model User {
id Int @id @default(autoincrement()) // id 自增整数
name String // 名字 字符串
email String @unique // 电子邮件 字符串 唯一值
posts Post[] // 发布的文章 和Post形成一对多关系
}

随后执行命令,需要输入一个操作名

1
$ prisma migrate dev

表就被创建好了

增删改查

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
import express from 'express'

import { PrismaClient } from '@prisma/client'
const prisma = new PrismaClient()

const app = express()
app.use(express.json())

// 关联查找
app.get('/', async (req, res) => {
const data = await prisma.user.findMany({
include: {
posts: true
}
})
res.send(data)
})

// 根据id查找数据
app.get('/user/:id', async (req, res) => {
const row = await prisma.user.findMany({
where: {
id: Number(req.params.id)
}
})
res.send(row)
})

// 添加数据
app.post('/create', async (req, res) => {
const { name, email } = req.body
const data = await prisma.user.create({
data: {
name,
email,
posts: {
create: {
title: '标题',
publish: true
},
}
}
})
res.send(data)
})

// 更新数据
app.post('/update', async (req, res) => {
const { id, name, email } = req.body
const data = await prisma.user.update({
where: {
id: Number(id)
},
data: {
name,
email
}
})
res.send(data)
})

// 删除数据
app.post('/delete', async (req, res) => {
const { id } = req.body
// 需要先把关联数据删除
await prisma.post.deleteMany({
where: {
authorId: Number(id)
}
})
// 才能把本身的数据删除
const data = await prisma.user.delete({
where: {
id: Number(id),
},
})
res.send(data)
})

app.listen(11451, () => {
console.log(`Server on 11451`)
})