#mysql #nestjs #typeorm
#mysql #nestjs #typeorm
Вопрос:
У нас есть 2 объекта: EstateIntegrationEntity
и EstateEntity
Когда мы пытаемся использовать .findOne
on estateIntegrationRepository
, мы получаем следующую ошибку:
[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 ...
Мы создали OneToOne
отношение от EstateIntegrationEntity
к EstateEntity
.
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:
Вы можете изменить имя полей. У меня только что была аналогичная ошибка, и я исправил ее, изменив имя с помощью @Column({ name: ‘name_the_fields_with_different_name’ }). Потому что проблема в том, что если в таблицах у него одно и то же имя, когда он выполняет поиск, он должен иметь поля с тем же именем.
Ответ №2:
Для этого случая у вас есть 3 решения для этого:
1- измените имя столбца с ‘estate_id’ на что-нибудь еще, например ‘id_estate’
2- написать пользовательскую инструкцию join с помощью 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(),
}