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
相关产品推荐
相关产品推荐

