复杂连表查询
注意
- tinyint(1) 会自动把数字类型转换为布尔类型,所以一般 定义表的时候 tinyint 不写长度
Prisma 连表规则
Prisma 连表查询,前提是必须在 scheme 设置了外键规则.然后通过include
查询 否则无法进行连表查询
但有的时候我们不想改变表的结构,那只有通过原生 sql 语句了
原生 sql 语句
注意
- 变量名称只能用于数据,不能用于列名或表名或数据库名,也不能用于数据库关键字
$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
返回受数据库操作影响的行数,例如 UPDATE
或 DELETE
。该函数不返回数据库记录。以下查询更新数据库中的记录并返回已更新的记录数:
- 代码
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);