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

NestJS中TypeORM执行原生查询强制列名转小写问题求助

问题原因
  1. PostgreSQL默认会将未被双引号包裹的SQL标识符(表名、列名等)自动转换为全小写,你看到的userid被转小写是PostgreSQL服务端的行为,不是TypeORM处理的,从你的报错日志里的query字段可以看到,TypeORM实际发送到数据库的SQL仍然保留了userId写法。
  2. 你之前尝试双引号包裹无效,大概率是双引号的使用方式不符合要求,或者存在转义错误,同时你直接在模板字符串中拼接${id}的写法存在SQL注入风险,属于不规范的原生查询写法。
可行解决方案
  • 方案1:正确使用双引号包裹驼峰列名,配合参数化查询(最推荐,适配现有表结构)
    正确代码示例如下:
// 列名用双引号包裹保留大小写,使用$1作为参数占位符
const queryText = `SELECT * FROM user_roles_role WHERE user_roles_role."userId" = $1`
try {
  // 第二个参数传入参数数组,避免SQL注入
  const rawData = await this.connection.query(queryText, [id]);
  return rawData;
} catch (err) {
  console.log(err);
  return err;
}

注意:PostgreSQL中只有双引号可以用来包裹标识符保留大小写,单引号只能用来包裹字符串值,所以用单引号包裹列名是无效的。

  • 方案2:统一使用蛇形命名避免大小写问题
    如果可以调整表结构或者实体配置,建议在TypeORM实体定义时指定列的数据库名为蛇形格式,后续不管是ORM查询还是原生查询都不需要处理大小写问题,实体配置示例:
@Column({ name: 'user_id' })
userId: number;

调整后原生查询直接写user_id即可:

const queryText = `SELECT * FROM user_roles_role WHERE user_roles_role.user_id = $1`
  • 方案3:全局配置TypeORM命名策略
    你也可以在TypeORM的配置项中开启自动驼峰转蛇形的命名策略,所有实体的驼峰属性会自动映射到数据库的蛇形列,不需要手动指定每个列的name,适合项目整体统一命名规范的场景。

内容的提问来源于stack exchange,提问作者Renan Fernandes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 02:45:02