Prisma执行原生SQL多表查询提示关系不存在如何解决
报错原因
prisma.$queryRaw执行的是原生透传SQL,直接发送到底层数据库执行,完全不经过Prisma模型层的名称映射逻辑,你在Prisma Schema里定义的模型名、配置的关联关系,对原生SQL查询完全不生效。- Prisma有默认的命名映射规则:Schema中大驼峰格式的单数模型名,会自动映射为数据库中小写下划线分隔的复数表名:
- 模型
UserSetting默认对应数据库表user_settings - 模型
User默认对应数据库表users
- 模型
- 你在SQL中直接写了Prisma模型名
UserSetting作为表名,数据库中不存在这个命名的表,因此抛出relation "userSetting" does not exist错误。
修复方法
方案1:修改原生SQL的表名为数据库实际表名
直接把SQL里的表名替换成数据库中真实存在的表名即可,默认配置下修正后的代码如下:
const a = await prisma.$queryRaw` SELECT r.name as name, r.profileId as profile, o.lastName as lastName FROM user_settings r , users o WHERE r."userId" = o.id `
注意:如果你在Prisma Schema中通过
@@map("自定义表名")给模型指定了自定义表名,SQL里要替换成你自定义的表名;如果是PostgreSQL这类大小写敏感的数据库,字段名如果是驼峰命名还需要给字段加双引号包裹。
如果不确定实际表名,可以查看项目中的Prisma迁移文件,或者运行npx prisma studio在可视化界面中核对表名。
方案2:改用Prisma ORM原生查询API(推荐)
如果没有必须写原生SQL的场景,直接用Prisma自带的查询方法,不需要手动处理表名、字段名映射,也能直接复用你配置的关联关系:
const a = await prisma.userSetting.findMany({ select: { name: true, profileId: true, user: { select: { lastName: true } } } })
内容的提问来源于stack exchange,提问作者Jessica
相关产品推荐
相关产品推荐

