4.3.2 如何操作表里的数据——DML 数据操作:INSERT/UPDATE/DELETE/SELECT
一句话破题
DML 是用来操作数据的语言——就是我们熟悉的 CRUD,只不过用 SQL 写出来。
INSERT:插入数据
插入单条:
sql
INSERT INTO users (id, email, name)
VALUES ('uuid-1', 'user@example.com', '张三');插入多条:
sql
INSERT INTO users (id, email, name) VALUES
('uuid-1', 'user1@example.com', '用户1'),
('uuid-2', 'user2@example.com', '用户2');Prisma 对照:
typescript
// 单条
await prisma.user.create({
data: { email: 'user@example.com', name: '张三' }
})
// 多条
await prisma.user.createMany({
data: [
{ email: 'user1@example.com', name: '用户1' },
{ email: 'user2@example.com', name: '用户2' }
]
})SELECT:查询数据
基础查询:
sql
-- 查询所有列
SELECT * FROM users;
-- 查询指定列
SELECT id, name FROM users;
-- 条件查询
SELECT * FROM users WHERE email = 'user@example.com';常用条件:
sql
-- 模糊匹配
SELECT * FROM users WHERE name LIKE '张%';
-- 范围查询
SELECT * FROM posts WHERE created_at > '2024-01-01';
-- 多条件
SELECT * FROM users WHERE role = 'ADMIN' AND status = 'ACTIVE';
-- IN 查询
SELECT * FROM users WHERE id IN ('uuid-1', 'uuid-2');排序和分页:
sql
-- 排序
SELECT * FROM posts ORDER BY created_at DESC;
-- 分页(PostgreSQL)
SELECT * FROM posts LIMIT 10 OFFSET 0;Prisma 对照:
typescript
await prisma.user.findMany({
where: {
name: { contains: '张' },
role: 'ADMIN'
},
orderBy: { createdAt: 'desc' },
take: 10,
skip: 0
})UPDATE:更新数据
更新单条/多条:
sql
-- 更新指定记录
UPDATE users SET name = '李四' WHERE id = 'uuid-1';
-- 批量更新
UPDATE users SET status = 'INACTIVE' WHERE last_login < '2024-01-01';Prisma 对照:
typescript
// 单条
await prisma.user.update({
where: { id: 'uuid-1' },
data: { name: '李四' }
})
// 批量
await prisma.user.updateMany({
where: { lastLogin: { lt: new Date('2024-01-01') } },
data: { status: 'INACTIVE' }
})注意
UPDATE 不带 WHERE 条件会更新所有记录!
sql
-- 危险!会更新所有用户
UPDATE users SET status = 'DELETED';DELETE:删除数据
sql
-- 删除指定记录
DELETE FROM users WHERE id = 'uuid-1';
-- 批量删除
DELETE FROM users WHERE status = 'DELETED';Prisma 对照:
typescript
await prisma.user.delete({ where: { id: 'uuid-1' } })
await prisma.user.deleteMany({ where: { status: 'DELETED' } })警告
DELETE 不带 WHERE 条件会删除所有数据!
sql
-- 危险!会删除所有用户
DELETE FROM users;SQL vs Prisma 速查表
| 操作 | SQL | Prisma |
|---|---|---|
| 插入 | INSERT INTO ... VALUES | create() |
| 查询全部 | SELECT * FROM | findMany() |
| 条件查询 | WHERE column = value | where: { column: value } |
| 模糊查询 | LIKE '%keyword%' | contains: 'keyword' |
| 排序 | ORDER BY column DESC | orderBy: { column: 'desc' } |
| 分页 | LIMIT 10 OFFSET 0 | take: 10, skip: 0 |
| 更新 | UPDATE ... SET ... WHERE | update() |
| 删除 | DELETE FROM ... WHERE | delete() |
本节小结
- DML 用于操作数据(INSERT/SELECT/UPDATE/DELETE)
- Prisma 提供类型安全的 DML 封装
- UPDATE 和 DELETE 一定要带 WHERE 条件
- 理解 SQL 有助于调试 Prisma 生成的查询
