Prisma 模型语法
模型语法就是通过模型能够直接调用的方法
findUnique()
查询允许你检索单个数据库记录
- 代码
ts
const user = await prisma.user.findUnique({
where: {
id: 17,
},
});
console.log(user);- 返回值
注意
查询不到就返回 null
查询的到就返回结果
findUniqueOrThrow()
查询允许你检索单个数据库记录
如果找不到记录,则抛出错误
ts
async function main() {
try {
const result = await prisma.emp.findUniqueOrThrow({
where: {
id: 100,
},
});
console.log(result);
} catch (e) {
console.log("异常");
console.log(e);
}
}- 返回值
注意
查询不到就抛出异常
查询的到就返回结果
findFirst()
findFirst 返回列表中符合你的条件的第一条记录
- 代码
ts
const user = await prisma.user.findFirst({
where: {
id: {
gte: 1,
},
},
});
console.log(user);- 返回结果
注意
查询不到就返回 null
查询的到就返回结果
findFirstOrThrow()
findFirstOrThrow 返回列表中符合你的条件的第一条记录
如果找不到记录,则抛出错误
- 代码
ts
const user = await prisma.user.findFirst({
where: {
id: {
gte: 1,
},
},
});
console.log(user);- 返回结果
注意
查询不到就抛出异常
查询的到就返回结果
findMany()
findMany 返回一个包含所有符合你条件的记录的列表
- 代码
ts
const user = await prisma.user.findMany({
where: {
id: {
gt: 1,
},
},
});
console.log(user);- 返回结果
注意
查询不到就返回空数组
查询的到就返回结果
create()
创建单个对象
- 代码
ts
const user = await prisma.user.create({
data: {
name: "Alice", // 字段名: 字段值
password: "alice@prisma.io",
},
});- 返回值(创建成功后的值)
bash
{
id: 10,
name: 'Alice2',
password: 'alice@prisma.io'
}连表插入
- 我这里拿 rbac 权限举例子,数据库外键关系之类的一定要定义好
ts
async init() {
// 用户列表
const user1 = new RegisteruserEntity();
user1.username = 'admin';
user1.password = this.cryptoService.md5Encrypt('123456');
user1.email = 'admin@qq.com';
user1.phone_number = '19000000001';
user1.nick_name = 'jsopy_admin';
user1.head_pic = 'https://file.jsopy.com/IMAGES/avatarsmoke.jpg';
user1.is_admin = 1; // 超级管理员
user1.is_frozen = 2; // 未冻结
const user2 = new RegisteruserEntity();
user2.username = 'guest';
user2.password = this.cryptoService.md5Encrypt('123456');
user2.email = 'guest@qq.com';
user2.phone_number = '19000000001';
user2.head_pic = 'https://file.jsopy.com/IMAGES/avatarsmoke.jpg';
user2.is_admin = 2; //普通用户
user2.is_frozen = 2; // 未冻结
user2.nick_name = 'jsopy_guest';
// 权限
const role1 = new RulesEntity();
role1.name = '超级管理员';
const role2 = new RulesEntity();
role2.name = '普通用户';
// 权限列表
const permissions1 = new PermissionsEntity();
permissions1.code = 'admin';
permissions1.description = 'admin';
const permissions2 = new PermissionsEntity();
permissions2.code = 'guest';
permissions2.description = 'user';
// 添加角色哪个没有外连哪个优先插入 creatMany 不支持嵌套插入 所有有外联不适用
const permissionarr = [permissions1, permissions2];
const permissionresult: any[] = [];
for (let i = 0; i < permissionarr.length; i++) {
const item = permissionarr[i];
const result = await this.prisma.permissions.create({ data: item });
permissionresult.push(result);
}
// 角色
role1.roles_permissions = {
create: [
{
permission_id: permissionresult[0].id,
},
{
permission_id: permissionresult[1].id,
},
],
};
role2.roles_permissions = {
create: [
{
permission_id: permissionresult[1].id,
},
],
};
// 添加角色
const rolearr = [role1, role2];
const roleresult: any[] = [];
for (let i = 0; i < rolearr.length; i++) {
const item = rolearr[i];
const result = await this.prisma.roles.create({ data: item });
roleresult.push(result);
}
console.log(roleresult);
// 外链 1
user1.user_roles = {
create: [
{
role_id: roleresult[0].id,
},
],
};
// 外链 2
user2.user_roles = {
create: [
{
role_id: roleresult[1].id,
},
],
};
// 添加用户
const userarr = [user1, user2];
const userresult: any[] = [];
for (let i = 0; i < userarr.length; i++) {
const item = userarr[i];
const result = await this.prisma.users.create({ data: item });
userresult.push(result);
}
console.log(userresult);
return '初始化成功';
}createMany()
创建多条记录(用的多)
注意
通过返回值的 count 来确定插入成功没有
createMany 不支持嵌套插入(比如说连表 多对多)
- 代码
ts
const userall = await prisma.user.createMany({
data: [
{
name: "Alice2",
password: "alice@prisma.io",
},
{
name: "Bob2",
password: "bob@prisma.io",
},
],
});- 返回值
ts
{
count: 2;
} // 2 条记录被创建 2就是对应的data数组中的对象个数update()
更新单个对象
- 代码
ts
const updateUser = await prisma.user.update({
where: {
id: 2,
},
data: {
name: "jsopy",
},
});
console.log(updateUser);- 返回值
bash
{
id: 2,
name: 'jsopy',
password: 'alice@prisma.io',
createdAt: 2025-09-29T05:32:03.929Z
}updateMany()
更新多条记录
- 代码
ts
const updateUser = await prisma.user.updateMany({
where: {
password: "alice@prisma.io",
},
data: {
name: "jsopy",
},
});
console.log(updateUser);- 返回值
ts
{
count: 2;
} // 2 条记录被更新 2就是对应的data数组中的对象个数delete()
删除单个对象
- 代码
ts
const deleteUser = await prisma.user.delete({
where: {
id: 2,
},
});
console.log(deleteUser);- 返回值
bash
{
id: 2,
name: 'jsopy',
password: 'alice@prisma.io',
createdAt: 2025-09-29T05:32:03.929Z
}deleteMany()
删除多条
- 代码
ts
const deleteUsers = await prisma.user.deleteMany({
where: {
id: {
gt: 10,
},
},
});- 返回值
ts
{
count: 3; // 删除几条就是几条
}- 删除所有记录
ts
const deleteUsers = await prisma.user.deleteMany();count()
- 代码
ts
const result = await prisma.dept.count({
where: {
id: {
gt: 2,
},
},
});
console.log(result);- 返回值
ts
4; // 返回符合条件的记录数null 和非 null
- 代码
ts
const result = await prisma.emp.count({
select: {
_all: true,
job: true,
},
});
console.log(result);- 返回值
ts
{ _all: 17, job: 16 } // _all表示返回所有包含null和非null的记录数 job表示返回所有非null的job字段记录数aggregate()
获取所有条数,最大值,最小值,求和,平均值 等
- 代码
ts
const result = await prisma.emp.aggregate({
_count: {
_all: true, // 所有的个数
},
_avg: {
age: true, // 年龄平均值
},
_sum: {
age: true, // 年龄总和
},
_min: {
age: true, // 年龄最小值
},
_max: {
age: true, // 年龄最大值
},
});
console.log(result);- 返回值
ts
{
_count: { _all: 17 },
_avg: { age: 38.4118 },
_sum: { age: 653 },
_min: { age: 19 },
_max: { age: 88 }
}groupBy()
分组
- 代码
查询每个部门年龄的平均值,年龄总和,年龄最大值,年龄最小值,年龄个数
ts
const result = await prisma.emp.groupBy({
by: ["job"],
_count: {
_all: true, // 所有的个数
},
_avg: {
age: true, // 年龄平均值
},
_sum: {
age: true, // 年龄总和
},
_min: {
age: true, // 年龄最小值
},
_max: {
age: true, // 年龄最大值
},
});
console.log(result);- 返回结果
ts
[
{
_count: { _all: 1 },
_avg: { age: 66 },
_sum: { age: 66 },
_min: { age: 66 },
_max: { age: 66 },
job: "总裁",
},
{
_count: { _all: 1 },
_avg: { age: 20 },
_sum: { age: 20 },
_min: { age: 20 },
_max: { age: 20 },
job: "项目经理",
},
{
_count: { _all: 3 },
_avg: { age: 41.3333 },
_sum: { age: 124 },
_min: { age: 33 },
_max: { age: 48 },
job: "开发",
},
{
_count: { _all: 1 },
_avg: { age: 19 },
_sum: { age: 19 },
_min: { age: 19 },
_max: { age: 19 },
job: "程序员鼓励师",
},
{
_count: { _all: 1 },
_avg: { age: 60 },
_sum: { age: 60 },
_min: { age: 60 },
_max: { age: 60 },
job: "财务总监",
},
{
_count: { _all: 1 },
_avg: { age: 19 },
_sum: { age: 19 },
_min: { age: 19 },
_max: { age: 19 },
job: "会计",
},
{
_count: { _all: 1 },
_avg: { age: 23 },
_sum: { age: 23 },
_min: { age: 23 },
_max: { age: 23 },
job: "出纳",
},
{
_count: { _all: 1 },
_avg: { age: 20 },
_sum: { age: 20 },
_min: { age: 20 },
_max: { age: 20 },
job: "市场部总监",
},
{
_count: { _all: 3 },
_avg: { age: 31.3333 },
_sum: { age: 94 },
_min: { age: 19 },
_max: { age: 56 },
job: "职员",
},
{
_count: { _all: 1 },
_avg: { age: 88 },
_sum: { age: 88 },
_min: { age: 88 },
_max: { age: 88 },
job: "销售总监",
},
{
_count: { _all: 2 },
_avg: { age: 39 },
_sum: { age: 78 },
_min: { age: 38 },
_max: { age: 40 },
job: "销售",
},
{
_count: { _all: 1 },
_avg: { age: 42 },
_sum: { age: 42 },
_min: { age: 42 },
_max: { age: 42 },
job: null,
},
];