在NestJS+TypeORM中处理SQL Server含点表名的问题
问题:TypeORM操作SQL Server含点表名报错
开发NestJS项目时,使用TypeORM与SQL Server交互,目标表名为dbo.Bonos.Bonos,执行任何数据库操作时都会报错:
Error: Invalid object name 'dbo.Bonos.Bonos '.
当前定义的实体代码如下:
import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm'; @Entity({ schema: 'dbo', name: 'Bonos.Bonos' }) // **** IMPORTANT: Define the table and schema name **** export class BonosEntity { @PrimaryGeneratedColumn() idBono: number; @Column() codigo: string; @Column() promocionId: string; @Column() NIF: string; @Column() CUPS: string; @Column() habilitado: number; @Column({ type: 'date' }) fechaInicio: Date; @Column({ type: 'date' }) fechaFin: Date; @Column({ type: 'date' }) fechaUso: Date; @Column() importe: number; }
解决方案
问题根源是TypeORM会将表名中的.视为schema和表名的分隔符,导致错误识别表结构。核心解决思路是让TypeORM将Bonos.Bonos当作完整表名处理,有两种可行方式:
方式一:实体装饰器中手动包裹表名
修改@Entity装饰器的name参数,用反引号包裹含点的表名:
@Entity({ schema: 'dbo', name: '`Bonos.Bonos`' })
这样TypeORM生成SQL时会保留完整表名,避免.被错误解析。
方式二:全局开启自动引号包裹
如果项目中有多个含特殊字符的表,可在TypeORM全局配置中开启quoteIdentifiers选项,让框架自动为所有表名、列名添加引号:
// 在app.module.ts的TypeOrmModule配置中添加 TypeOrmModule.forRoot({ type: 'mssql', host: '你的数据库地址', port: 1433, username: '用户名', password: '密码', database: '数据库名', entities: [BonosEntity], synchronize: false, options: { encrypt: true, // 根据你的SQL Server实际配置调整 }, quoteIdentifiers: true, // 开启自动引号包裹 })
开启后,TypeORM会自动用SQL Server支持的方括号包裹表名,生成的SQL类似:
SELECT * FROM [dbo].[Bonos.Bonos]
内容的提问来源于stack exchange,提问作者Pablo Álvarez Relat
相关产品推荐
相关产品推荐

