LoginSignup
2
1

More than 3 years have passed since last update.

typeormで Duplicate column name と出てしまうときの解決法

Posted at

解決法

Issue with snake_case naming strategy

const SnakeNamingStrategy = require('typeorm-naming-strategies').SnakeNamingStrategy;

module.exports = {
   type: "mysql",
   host: "localhost",
   port: 3306,
   ...
   namingStrategy: new SnakeNamingStrategy(),
}

説明

以下のようなentityがあったとする。

import {Entity, PrimaryGeneratedColumn, Column, ManyToOne, JoinColumn} from "typeorm";
import {User} from "./User";

@Entity()
export class Photo {

    @PrimaryGeneratedColumn()
    id: number;

    @ManyToOne(type => User, user => user.photos, { eager: true })
    @JoinColumn({ name: 'user_id' })
    user: User;

}

--- 

import {Entity, PrimaryGeneratedColumn, Column, OneToMany} from "typeorm";
import {Photo} from "./Photo";

@Entity()
export class User {

    @PrimaryGeneratedColumn()
    id: number;

    @OneToMany(type => Photo, photo => photo.user)
    photos: Photo[];

}

このとき、photoRepository.findOne()を実行すると、以下のようなクエリが実行されてDuplicate column nameのエラーが出てしまう。

SELECT DISTINCT ~
FROM (SELECT `Photo`.`user_id`  AS `Photo_user_id`,
             `Photo_user`.`id`  AS `Photo_user_id`,
~

そこで、上記解決法にあるnamingStrategyを導入することにより、以下のようなクエリが実行されるようになりエラーがでなくなる。めでたしめでたし。1

SELECT DISTINCT ~
FROM (SELECT `Photo`.`user_id`  AS `Photo_user_id`,
             `Photo__user`.`id`  AS `Photo__user_id`,
~

参考
Duplicate alias names for different fields - Stack Overflow
Issue with snake_case naming strategy


  1. 0.3.0でデフォルトで対応する予定らしいが、該当issueが立てられたのは2018年5月。いつになることやら… 

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1