You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 17:39:20