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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 06:35:03