【问题标题】:Duplicate alias names for different fields不同字段的别名重复
【发布时间】:2018-08-17 08:42:16
【问题描述】:

我正在使用 typeorm v 0.1.14。

typeorm 似乎为多对一连接中的两个不同列生成了相同的别名。如果我在 @ManyToOne 装饰器中使用预先加载(例如,它使用存储库上的 .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;
}

以最简单的方式使用上述实体: 让结果:样本[] | null = 等待 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 抱怨列名重复。

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

【问题讨论】:

    标签: typescript postgresql-9.3 typeorm


    【解决方案1】:

    这是使用蛇案例命名策略的数据库的已知 TypeORM 错误,显然将在其 0.3.0 版本中修复(请参阅此线程:https://github.com/typeorm/typeorm/issues/2200

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

    const SnakeNamingStrategy = require('typeorm-naming-strategies').SnakeNamingStrategy;
    
    module.exports = {
       type: ...,
       host: ...,
       port: ...,
       ...
       namingStrategy: new SnakeNamingStrategy(),
    }
    

    这比你目前的工作要好一些

    【讨论】:

      【解决方案2】:

      我面临同样的问题,很遗憾没有人修复这个错误。 我为这个问题找到了一个丑陋的解决方法:你必须使用与你所指的类名不同的列名。

      【讨论】:

      • 我想我最终删除了有问题的两列,因为它们不是绝对必要的。然后我因为其他原因切换到Objection.js
      • github.com/typeorm/typeorm/issues/2200 等待 0.3.0 发布,可能已经修复,现在我们使用 0.2.9 暂时“避免”这个问题。
      【解决方案3】:

      这是因为 TypeORM 当前将该列设置为唯一,您只需将列的唯一选项指定为false

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-10-13
        • 1970-01-01
        • 1970-01-01
        • 2022-11-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-16
        相关资源
        最近更新 更多