Nestjs中使用TypeORM的重复列名

Posted

技术标签:

【中文标题】Nestjs中使用TypeORM的重复列名【英文标题】:Duplicate column name with TypeORM in Nestjs 【发布时间】:2021-01-16 21:13:57 【问题描述】:

我们有 2 个实体:EstateIntegrationEntityEstateEntity

当我们尝试在estateIntegrationRepository 上使用.findOne 时,我们会收到以下错误:

[Nest] 5537   - 10/01/2020, 8:37:55 AM
[ExceptionsHandler] ER_DUP_FIELDNAME: Duplicate column name 'EstateIntegrationEntity_estate_id' +1590ms
QueryFailedError: ER_DUP_FIELDNAME: Duplicate column name 'EstateIntegrationEntity_estate_id'
    at ...

我们创建了一个从EstateIntegrationEntityEstateEntityOneToOne 关系。

import  EstateEntity  from "src/estates/estate.entity";
import  Column, Entity, JoinColumn, OneToOne, PrimaryGeneratedColumn, RelationId  from "typeorm";

@Entity( name: 'estate_integrations' )
export class EstateIntegrationEntity 
  @PrimaryGeneratedColumn()
  id: number;

  @RelationId((estateIntegrationEntity: EstateIntegrationEntity) => estateIntegrationEntity.estate)
  estate_id: number;

  @OneToOne(() => EstateEntity,  eager: true )
  @JoinColumn( name: 'estate_id' )
  estate: EstateEntity;

  ...

还有从EstateEntityEstateIntegrationEntity 的关系:

import  EstateIntegrationEntity  from 'src/integrations/estate.integration.entity';
import  Column, Entity, JoinColumn, ManyToOne, OneToOne, PrimaryGeneratedColumn  from 'typeorm';

@Entity('estates')
export class EstateEntity 
  @PrimaryGeneratedColumn()
  id: number;

  @Column('varchar' || null)
  uuid: string;

  @OneToOne(
    () => EstateIntegrationEntity,
    estate_integration => estate_integration.estate,
  )
  estate_integration: EstateIntegrationEntity;

这个错误只发生在.findOne() 而不是.find()

async findEstateById(id: string): Promise<EstateIntegrationEntity> 
  return await this.estateIntegrationRepository.findOne(
    where: 
      external_id: id
    
  );

【问题讨论】:

【参考方案1】:

对于这种情况,您有 3 个解决方案:

1- 将列名从“estate_id”更改为“id_estate”之类的其他名称

2- 使用 TypeORM 编写自定义连接语句

3- 我最喜欢的解决方案是使用这样的命名策略:

第一install npm i --save typeorm-naming-strategies 然后在你的 typeorm 配置文件中
const SnakeNamingStrategy = require('typeorm-naming-strategies')
  .SnakeNamingStrategy;
   module.exports = 
        name: 'name',
        type: 'mysql',
        host: 'localhost',
        port: 3306,
       ...
       namingStrategy: new SnakeNamingStrategy(),
    

【讨论】:

【参考方案2】:

您可以更改字段的名称。我刚刚遇到了类似的错误并修复了它使用@Column( name:'name_the_fields_with_different_name')更改名称。因为如果在表中它具有相同的名称,那么它在查找时必须具有相同名称的字段。

【讨论】:

以上是关于Nestjs中使用TypeORM的重复列名的主要内容,如果未能解决你的问题,请参考以下文章

TypeORM:更改主键长度后出现重复输入错误

将 TypeORM 实体模型类与 NestJS-GraphQL 模式类型结合使用好吗?

Nx-NestJS-TypeOrm: SyntaxError: Unexpected token

无法使用 typeorm (NestJS) 在 SQL Server 中插入 bigint

在 Nestjs 中注入 Tree Typeorm 存储库

如何在 NestJs 中捕获 Typeorm 事务错误