Typescript 不同字段的别名重复

Typescript 不同字段的别名重复,typescript,postgresql-9.3,typeorm,Typescript,Postgresql 9.3,Typeorm,我用的是打字机V0.1.14 typeorm似乎在为多对一联接中的两个不同列生成相同的别名。无论我是在@manytone装饰器中使用渴望加载(例如,它使用存储库中的.find()方法加载子对象),还是使用查询生成器功能加载关系 下面是我可以用的最简单的例子 // SampleStatus entity/file: import { Entity, Column, ManyToOne, PrimaryGeneratedColumn } from 'typeorm'; @Entity({name:

我用的是打字机V0.1.14

typeorm似乎在为多对一联接中的两个不同列生成相同的别名。无论我是在
@manytone
装饰器中使用渴望加载(例如,它使用存储库中的
.find()
方法加载子对象),还是使用查询生成器功能加载关系

下面是我可以用的最简单的例子

// SampleStatus entity/file:
import { Entity, Column, ManyToOne, PrimaryGeneratedColumn } from 'typeorm';

@Entity({name: 'statuses', schema: 'master'})
export class SampleStatus {

    @PrimaryGeneratedColumn()
    public id: number;
}

// Sample entity that has a child statusimport { Entity, Column, ManyToOne, PrimaryGeneratedColumn } from 'typeorm';
import { SampleStatus } from './sample-status.entity';

@Entity({ name: 'samples', schema: 'master'})
export class Sample {

    @PrimaryGeneratedColumn()
    public id: number;

    @Column()
    public name: string;

    @ManyToOne(type => SampleStatus, status => status.id, { eager: true })
    public status: SampleStatus;
}
以最简单的方式使用上述实体: let result:Sample[]| null=await getRepository(Sample.find()||[]

这将生成以下由我格式化的日志查询:

SELECT "Sample"."id" AS "Sample_id", 
  "Sample"."name" AS "Sample_name", 
  "Sample"."status_id" AS "Sample_status_id", 
  "Sample_status"."id" AS "Sample_status_id" 
FROM "master"."samples" "Sample" 
  LEFT JOIN "master"."statuses" "Sample_status" 
    ON "Sample_status"."id"="Sample"."status_id"
请注意这两个名称是如何生成的——它们都是具有相同别名的列名

我正在使用我找到的这段代码,它将实体属性名转换为蛇壳。这将传递到连接设置中

import { DefaultNamingStrategy, NamingStrategyInterface } from "typeorm";
import { snakeCase } from 'typeorm/util/StringUtils'

export class SnakeCaseNamingStrategy extends DefaultNamingStrategy  {

    tableName(targetName: string, userSpecifiedName: string): string {
        return userSpecifiedName ? userSpecifiedName : snakeCase(targetName);
    }

    columnName(propertyName: string, customName: string, embeddedPrefixes: string[]): string {
        return snakeCase(embeddedPrefixes.concat(customName ? customName : propertyName).join("_"));
    }

    columnNameCustomized(customName: string): string {
        return customName;
    }

    relationName(propertyName: string): string {
        return snakeCase(propertyName);
    }

    joinTableName(firstTableName: string, secondTableName: string, firstPropertyName: string, secondPropertyName: string): string {
        return `${snakeCase(firstTableName)}_${secondTableName}`;
    }
}
虽然被拉回的值是相同的(因为它是一个联接列),并且在运行时不会真正引起问题,但我在获取记录的查询并将其转换为视图时注意到了这一点。Postgres抱怨列名重复

有没有办法将第二个选择别名为其他名称,或者根本不选择第二个值?

我面临着同样的问题,很遗憾没有人修复这个错误。
对于这个问题,我发现了一个丑陋的解决方法:您必须使用与所引用的类名不同的列名。这是使用snake-case命名策略的数据库的一个已知TypeORM错误,该错误显然将在其0.3.0版本中修复(请参阅此线程:)

现在,您可以通过如下定义命名策略来解决此问题:

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

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

这比你目前的工作要好一点,因为TypeORM当前设置的列是唯一的,你只需将列的唯一选项指定为
false

,我想我最终删除了这两个有问题的列,因为它们不是绝对必要的。然后我出于其他原因切换到
objective.js
。等待0.3.0版本,可能已经修复,现在我们使用0.2.9暂时“避免”这个问题。