Nestjs中使用TypeORM的重复列名
Posted
技术标签:
【中文标题】Nestjs中使用TypeORM的重复列名【英文标题】:Duplicate column name with TypeORM in Nestjs 【发布时间】:2021-01-16 21:13:57 【问题描述】:我们有 2 个实体:EstateIntegrationEntity
和 EstateEntity
当我们尝试在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 ...
我们创建了一个从EstateIntegrationEntity
到EstateEntity
的OneToOne
关系。
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;
...
还有从EstateEntity
到EstateIntegrationEntity
的关系:
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 实体模型类与 NestJS-GraphQL 模式类型结合使用好吗?
Nx-NestJS-TypeOrm: SyntaxError: Unexpected token