Skip to content

Prisma 模型语法

模型语法就是通过模型能够直接调用的方法

findUnique()

查询允许你检索单个数据库记录

  • 代码
ts
const user = await prisma.user.findUnique({
  where: {
    id: 17,
  },
});
console.log(user);
  • 返回值

注意

  1. 查询不到就返回 null

  2. 查询的到就返回结果

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);
  }
}
  • 返回值

注意

  1. 查询不到就抛出异常

  2. 查询的到就返回结果

findFirst()

findFirst 返回列表中符合你的条件的第一条记录

  • 代码
ts
const user = await prisma.user.findFirst({
  where: {
    id: {
      gte: 1,
    },
  },
});
console.log(user);
  • 返回结果

注意

  1. 查询不到就返回 null

  2. 查询的到就返回结果

findFirstOrThrow()

findFirstOrThrow 返回列表中符合你的条件的第一条记录

如果找不到记录,则抛出错误

  • 代码
ts
const user = await prisma.user.findFirst({
  where: {
    id: {
      gte: 1,
    },
  },
});
console.log(user);
  • 返回结果

注意

  1. 查询不到就抛出异常

  2. 查询的到就返回结果

findMany()

findMany 返回一个包含所有符合你条件的记录的列表

  • 代码
ts
const user = await prisma.user.findMany({
  where: {
    id: {
      gt: 1,
    },
  },
});
console.log(user);
  • 返回结果

注意

  1. 查询不到就返回空数组

  2. 查询的到就返回结果

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()

创建多条记录(用的多)

注意

  1. 通过返回值的 count 来确定插入成功没有

  2. 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,
  },
];