Skip to content

复杂连表查询

注意

  1. tinyint(1) 会自动把数字类型转换为布尔类型,所以一般 定义表的时候 tinyint 不写长度

Prisma 连表规则

Prisma 连表查询,前提是必须在 scheme 设置了外键规则.然后通过include 查询 否则无法进行连表查询

但有的时候我们不想改变表的结构,那只有通过原生 sql 语句了

原生 sql 语句

注意

  1. 变量名称只能用于数据,不能用于列名或表名或数据库名,也不能用于数据库关键字

$queryRaw

$queryRaw 返回实际的数据库记录。例如,以下 SELECT 查询返回 User 表中每条记录的所有字段:

以参数的形式传递字面量,这样可以避免 sql 注入等问题

  • 代码如下
ts
const age = 60;
const result = await prisma.$queryRaw`select * from emp where age >${age}`;
console.log(result);

$queryRawUnsafe()

方法允许你将原始字符串(或模板字符串)传递到数据库。会有注入风险,请谨慎使用。

ts
const result = await prisma.$queryRawUnsafe(
  "SELECT * FROM emp  WHERE age > 60"
);
console.log(result);

$executeRaw

$executeRaw 返回受数据库操作影响的行数,例如 UPDATEDELETE。该函数不返回数据库记录。以下查询更新数据库中的记录并返回已更新的记录数:

  • 代码
ts
const changenum = 0;
const result: number =
  await prisma.$executeRaw`Update emp set sex = ${changenum} where id = 1`;
console.log(result.toString()); // 1

$executeRawUnsafe

方法允许你将原始字符串(或模板字符串)传递到数据库。会有注入风险,请谨慎使用。

ts
const changenum = 0;
const result: number = await prisma.$executeRawUnsafe(
  `Update emp set sex = ${changenum} where id = 1`
);
console.log(result.toString()); // 1

如果你想把 sql 语句分开单独查询

  • 你可以使用 prisma.sql 方法 它包裹了每个 sql 语句,防止注入风险
ts
// 1 查出员工表 2.查出部门表 3.两个结果结合,最后执行语句

const sq1 = Prisma.sql`Select e.* from emp e`;
const sq2 = Prisma.sql`Select d.* from dept d `;
const sq3 = Prisma.sql`Select s1.*,s2.name as deptname,s2.id as deptidall from (${sq1}) as s1 Left Join (${sq2}) as s2 on s1.dept_id = s2.id`;
const result = await prisma.$queryRaw(sq3);
console.log(result);