Typeorm NestJS duplicate column name

Viewed 64

We have this typeorm entities defined in our NestJS application:

@Entity()
export class Crawler {
  @PrimaryColumn({ length: 50 })
  id!: string;

  ...    

  @ManyToOne(() => CrawlerFamily, (crawlerFamily) => crawlerFamily.id, {
    nullable: false,
    eager: true,
  })
  @JoinColumn({ name: 'crawler_family_id' })
  crawler_family!: CrawlerFamily; 
}


@Entity()
export class CrawlerFamily {
  @PrimaryGeneratedColumn()
  id?: number;

  @Column({ length: 255 })
  name!: CrawlerFamilyName;
}

Now, when we try to search for this Crawler entity we need to use findBy instead of findOneBy when we want only one crawler, because when we try to use findOneBy this is the error message we get in response:

{"context":"RpcExceptionsHandler","level":"error","message":"Duplicate column name 'Crawler_crawler_family_id'","stack":["QueryFailedError: Duplicate column name 'Crawler_crawler_family_id'\n    at Query.<anonymous> (/home/node/app/node_modules/typeorm/driver/mysql/MysqlQueryRunner.js:158:37)\n    at /home/node/app/node_modules/newrelic/lib/shim/shim.js:1313:22\n    at LegacyContextManager.runInContext (/home/node/app/node_modules/newrelic/lib/context-manager/legacy-context-manager.js:59:23)\n    at DatastoreShim.applySegment (/home/node/app/node_modules/newrelic/lib/shim/shim.js:1303:25)\n    at Query.wrappedCallback [as onResult] (/home/node/app/node_modules/newrelic/lib/shim/shim.js:1189:21)\n    at Query.execute (/home/node/app/node_modules/mysql2/lib/commands/command.js:36:14)\n    at PoolConnection.handlePacket (/home/node/app/node_modules/mysql2/lib/connection.js:456:32)\n    at PacketParser.onPacket (/home/node/app/node_modules/mysql2/lib/connection.js:85:12)\n    at PacketParser.executeStart (/home/node/app/node_modules/mysql2/lib/packet_parser.js:75:16)\n    at TLSSocket.<anonymous> (/home/node/app/node_modules/mysql2/lib/connection.js:360:25)"],"timestamp":"2022-08-17T13:48:23.146Z"}

How to properly setup these entities? I've tried using @Column() decorator to change column name but it's not working.

1 Answers

You're using one to many/many to one wrong, see: https://orkhan.gitbook.io/typeorm/docs/many-to-one-one-to-many-relations

Here's what you should have:

@Entity()
export class Crawler {
  @PrimaryColumn({ length: 50 })
  id!: string;

  ...    

  @ManyToOne(() => CrawlerFamily, (crawlerFamily) => crawlerFamily.crawler, {
    nullable: false,
    eager: true,
  })
  crawler_family!: CrawlerFamily; 
}


@Entity()
export class CrawlerFamily {
  @PrimaryGeneratedColumn()
  id?: number;

  @Column({ length: 255 })
  name!: CrawlerFamilyName;

  @OneToMany(() => Crawler, (crawler) => crawler.crawlerFamily)
  crawler!: Crawler[];
}
Related