⚠️ Alpha内测版本警告:此为早期内部构建版本,尚不完整且可能存在错误,欢迎大家提Issue反馈问题或建议
Skip to content

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 速查表

操作SQLPrisma
插入INSERT INTO ... VALUEScreate()
查询全部SELECT * FROMfindMany()
条件查询WHERE column = valuewhere: { column: value }
模糊查询LIKE '%keyword%'contains: 'keyword'
排序ORDER BY column DESCorderBy: { column: 'desc' }
分页LIMIT 10 OFFSET 0take: 10, skip: 0
更新UPDATE ... SET ... WHEREupdate()
删除DELETE FROM ... WHEREdelete()

本节小结

  • DML 用于操作数据(INSERT/SELECT/UPDATE/DELETE)
  • Prisma 提供类型安全的 DML 封装
  • UPDATE 和 DELETE 一定要带 WHERE 条件
  • 理解 SQL 有助于调试 Prisma 生成的查询