Prisma基础用法
根据文档入门学习
增
插入一条数据
const user = await prisma.user.create({
data: {
email: 'xxxx@prisma.com',
name: 'xxxx xxx'
}
})
就相当于是:
INSERT INTO <表名> (字段1, 字段2, ...) VALUES (值1, 值2, ...);
前面说过了user是prisma client自动根据你写的schema.prisma自动推导的表及表结构
INSERT INTO 'user' ('email', 'name') VALUES ('xxxx@prisma.com', 'xxxx xxx')
此时create 返回的就是这一条插入的数据。
插入多条数据
const createMany = await prisma.user.createMany({
data: [
{
email: 'xxxx@prisma.com',
name: 'xxxx xxx'
},
{...}
],
skipDuplicates: true,
})
同mysql语句插入多条数据:
INSERT INTO 'user' ('email', 'name') VALUES ('xxxx@prisma.com', 'xxxx xxx'),('xxx@qq.com', '宝子'), (...)
这里的 skipDuplicates的意思是如果是重复的数据直接跳过,这个是可选的,但是如果不设置遇到重复的会导致本次操作失败,本次插入的数据全部回溯。
这里返回的数据与create返回的数据不一样,这里返回的是插入的条数。要想和create一样返回插入的数据,此时你应该使用createManyAndReturn,这个方法返回的是和create一致的。
删
删除数据
删除一条数据
我这里拿email
const deleteUser = await prisma.user.delete({
where: {
email: 'xxxx@qq.com',
}
})
就相当于mysql里的
DELETE FROM 'user' WHERE 'email'='xxxx@qq.com'
这里当条件成立的时候就会删除email === xxxx@qq.com的这一条记录。
需要注意的是:delete要求你传入的匹配项是唯一的,即带有 @unique 标记的字段,或者是id这样的自增字段。
delete返回的是删除的这一条数据的信息
删除多条数据
const deleteUsers = await prisma.user.deleteMany({
where: {
email: {
contains: 'xxxx@qq.com'
}
}
})
contains是prisma预定义的过滤操作符,相当于mysql的模糊查询 LIKE。所以这里的意思是删除所有email包含xxxx@qq.com的数据,相当于mysql的
DELETE FROM 'user' WHERE 'email' LIKE '%xxxx@qq.com%'
同createMany,deleteMany返回的也是删除了几条数据。
除了contains关键词,还有startsWith,匹配指定字符串开头的记录,类似与mysql的LIKE 'prefix%';
endsWIth,匹配指定字符串结尾的记录,类似mysql的LIKE '%suffix';
equals 精准匹配 就是默认的'email'='xxxx';
in 匹配数组中的任意一个值 DELETE FROM 'user' WHERE 'id' IN (1,2,3);
删除所有数据
使用deleteMany且不传入过滤参数时,此时就会删除所有数据;
const deleteUsers = await prisma.user.deleteMany({})
即不传任何过滤条件DELETE FROM user;
如果表数据有关联,直接删除全部将会失败,要删除数据需要先删除关联的数据后在执行删除全部数据;
改
即更新数据
更新单条数据
const updateUser = await prisma.user.update({
where: {
email: 'xxxx@qq.com'
},
data: {
name: 'zaq',
}
})
相当于mysql的
UPDATE user SET name='zaq' WHERE email='xxxx@qq.com'
同create会返回更新后的这一条数据;
更新多条数据
const updateUsers = await prisma.user.updateMany({
where: {
contains: 'xxx@qq.com'
},
data: {
role: 'ADMIN'
}
})
同上面解释的contains关键词的意思,user这张表里所有模糊匹配的xxx@qq.com的数据的role都将会修改成'ADMIN'。
换算成mysql的语句即:
UPDATE user SET role='ADMIN' WHERE 'email' LIKE '%xxx@qq.com%'
同样同上面的Many方法,返回的不是修改的所有数据,而是个数。
同样它也有updateManyAndReturn的方法,不赘述了。
更新或是创建
当你不确定这条数据是否存在于数据库时,你不需要先查询这条数据是否存在。而是直接使用upsert方法,他会自动帮你处理不存在就创建,存在就修改。非常的人性
const upsertUser = await prisma.user.upsert({
where: {
email: 'viola@prisma.io',
},
update: {
name: 'Viola the Magnificent',
},
create: {
email: 'viola@prisma.io',
name: 'Viola the Magnificent',
},
})
这个应该没有原生mysql支持吧,可能是我太菜了。
查
单条数据
查询单条数据,根据唯一值或者id匹配,同样要求值唯一。
const user = await prisma.user.findUnique({
where: {
email: 'xxxx@qq.com'
}
})
即最常见的sql语句
SELECT * FROM user WHERE email='xxxx@qq.com'
全部数据
当不传入过滤条件的时候就是获取全部数据
const users = await prisma.user.findMany()
条件过滤
只需要在findMany传入过滤条件即可,
返回符合条件的第一条记录(连表查询
根据关系表查询符合过滤条件的第一条数据
const findUser = await prisma.user.findFirst({
where: {
posts: {
some: {
likes: {
gt: 100,
},
},
},
},
orderBy: {
id: 'desc',
},
})
这段代码执行的过程是:
查询user和post表之间的关联字段posts,some是prisma的关系过滤器,表示只要有一条关联数据满足条件即可。所以这里的意思是查找post表里满足likes 大于100的第一个用户;
如果是mysql可能得这么写(假设这两张表的关联字段是authorId = id):
SELECT * FROM 'User' WHERE EXISTS (SELECT 1 FROM 'Post' WHERE 'Post'.'authorId'='User'.'id' AND 'Post'.'likes' > 100) ORDER BY 'id' DESC LIMIT 1;
- some: 只要关联的记录里有任何一个符合条件。
- every: 要求关联的所有记录都必须符合条件。
- none: 要求关联的所有记录都不符合条件。
gt: 100即 likes > 100 gt是 Greater Than 的缩写
分页
分页功能非常简单,skip即偏移,take偏移量。传入这两个就可以实现分页功能了,例如
prisma.post.findMany({
where: {...},
orderBy: { createdAt: 'desc' },
skip: (page - 1) * pageSize,
take: pageSize,
})
常用的实现分页功能即是如此;
排序
同上面的orderBy属性
orderBy: {
createdAt: 'desc'
}
甚至还支持多字段
orderBy: [
{ published: 'desc' },
{ createdAt: 'desc' }
]
选择字段
即查询数据库后不返回全部数据,而是返回指定的数据。将需要返回的数据放到select属性上即可;
const user = await prisma.user.findFirst({
select: {
email: true,
name: true,
},
})
这里查询user表后只会返回email,name这两个字段。
剩下的文档还有大部分没有看,后续有时间再更新,现有的CRUD基本上能面对大多数业务了。
待续...