gpt4 book ai didi

typescript - 不同字段的重复别名

转载 作者:搜寻专家 更新时间:2023-10-30 21:49:04 25 4
gpt4 key购买 nike

我正在使用 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 = 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}`;
}
}

虽然被拉回的值是相同的(因为它是一个连接列)并且在运行时并没有真正引起问题,但我在获取记录的查询并将其转换为 View 时注意到了这一点。 Postgres 提示重复的列名。

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

最佳答案

这是一个已知的 TypeORM 错误,适用于使用 snake case 命名策略的数据库,显然将在其 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(),
}

哪个比您当前的工作更好用

关于typescript - 不同字段的重复别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49182535/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com