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

TypeORM操作Oracle生成带双引号SQL致表不存在问题求助

解决TypeORM + NestJS操作Oracle时自动生成带双引号SQL的问题

问题说明

使用TypeORM搭配NestJS操作Oracle数据库时,遇到以下异常:

  • 调用Repository的find()方法查询数据时,触发ORA-00942: table or view does not exist错误
  • 查看TypeORM生成的SQL,发现表名和列名被双引号包裹(例如"branche"),而Oracle中未加引号的标识符会自动转为大写,带引号则严格区分大小写,导致无法匹配数据库中实际的大写表名BRANCHE
  • 改用Repository的query()方法执行原生SQL(SELECT * FROM BRANCHE)时,查询正常

解决方案

1. 实体类单独配置(针对单个实体)

在BRANCHE实体类的装饰器中,显式指定大写表名,并关闭引号转义:

import { Entity, Column, PrimaryColumn } from 'typeorm';

@Entity({ name: 'BRANCHE', quote: false })
export class BRANCHE {
  @PrimaryColumn({ name: 'ID', quote: false })
  id: number;

  @Column({ name: 'BRANCHE', quote: false })
  branche: string;

  @Column({ name: 'BRACHE_NAVN', quote: false })
  bracheNavn: string;

  @Column({ name: 'TS', quote: false })
  ts: Date;
}

关键:quote: false会让TypeORM生成SQL时不给该表/列名加双引号;表名和列名必须和Oracle数据库中实际的大写标识符完全一致。

2. 全局配置(所有实体生效)

如果希望所有实体默认都不使用双引号,可以在NestJS的TypeORM全局配置中添加quote: false:

import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { BRANCHE } from './entities/branche.entity';

@Module({
  imports: [
    TypeOrmModule.forRoot({
      type: 'oracle',
      host: '你的数据库地址',
      port: 1521,
      username: '用户名',
      password: '密码',
      sid: '数据库SID',
      entities: [BRANCHE],
      synchronize: false, // Oracle环境建议关闭自动同步表结构
      quote: false, // 全局关闭所有标识符的引号包裹
      logging: true, // 保留日志以便验证SQL生成情况
    }),
    TypeOrmModule.forFeature([BRANCHE]),
  ],
})
export class AppModule {}

3. 验证结果

配置完成后重启项目,查看TypeORM生成的SQL,应该不再带有双引号,例如:

SELECT Branche.ID AS Branche_ID, Branche.BRANCHE AS Branche_BRANCHE, Branche.BRACHE_NAVN AS Branche_BRACHE_NAVN, Branche.TS AS Branche_TS FROM BRANCHE Branche WHERE branche.id < :1 -- PARAMETERS: [10]

此时Oracle会自动将未加引号的标识符转为大写,匹配数据库中的BRANCHE表,即可正常查询数据。

内容的提问来源于stack exchange,提问作者Qadeer Ashraf

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 08:05:31