jon*_*eve 4 postgresql node.js typescript typeorm nestjs
我有一个使用 TypeORM 和 PostgreSQL 数据库的 Typescript Nestjs 项目,我在定义多对一关系时遇到了麻烦,因为 TypeORM 试图创建一个整数类型的 ID 字段,而我使用的是 UUID 字段。有没有办法告诉 TypeORM 使用与整数不同的数据类型?
下面是一个不工作的实体的例子:
export class AgentKitsEntity implements Model {
@PrimaryGeneratedColumn()
@Generated('uuid')
id: string;
}
@Entity({name: 'users'})
export class User extends AgentKitsEntity implements UserModel {
@Column()
username: string;
@ManyToOne(type => View)
@JoinColumn({name: 'view_id', referencedColumnName: 'id'})
view: View;
}
Run Code Online (Sandbox Code Playgroud)
这会导致以下错误:
query failed: ALTER TABLE "users" ADD CONSTRAINT "FK_2ed8b186dce83a446f94ac9aae4" FOREIGN KEY ("view_id") REFERENCES "views"("id")
error: { error: foreign key constraint "FK_2ed8b186dce83a446f94ac9aae4" cannot be implemented
at Connection.parseE (/home/jonathan/projects/agent-kits/api-data/node_modules/pg/lib/connection.js:554:11)
at Connection.parseMessage (/home/jonathan/projects/agent-kits/api-data/node_modules/pg/lib/connection.js:379:19)
at Socket.<anonymous> (/home/jonathan/projects/agent-kits/api-data/node_modules/pg/lib/connection.js:119:22)
at emitOne (events.js:116:13)
at Socket.emit (events.js:211:7)
at addChunk (_stream_readable.js:263:12)
at readableAddChunk (_stream_readable.js:250:11)
at Socket.Readable.push (_stream_readable.js:208:10)
at TCP.onread (net.js:601:20)
name: 'error',
length: 228,
severity: 'ERROR',
code: '42804',
detail: 'Key columns "view_id" and "id" are of incompatible types: integer and uuid.',
hint: undefined,
position: undefined,
internalPosition: undefined,
internalQuery: undefined,
where: undefined,
schema: undefined,
table: undefined,
column: undefined,
dataType: undefined,
constraint: undefined,
file: 'tablecmds.c',
line: '6503',
routine: 'ATAddForeignKeyConstraint' }
Run Code Online (Sandbox Code Playgroud)
编辑:需要明确的是,问题不是为主键创建 UUID 字段,这是有效的。问题是我引用的表(在本例中为“views”)使用 UUID 主键,因此我还需要对引用它的字段使用 UUID(在本例中为“views”)。TypeORM 会自动创建一个整数类型的“view_id”字段,大概是因为它假设主键值(应该?)总是整数(这让我觉得这是一个非常疯狂的假设)。
它必须以某种方式可配置,不是吗?
我最终找到了解决方案,我将其发布在这里以供将来参考。
以下对我有用:
export class AgentKitsEntity implements Model {
@PrimaryGeneratedColumn('uuid')
@Generated('uuid')
id: string;
}
@Entity({name: 'users'})
export class User extends AgentKitsEntity implements UserModel {
@Column()
username: string;
@ManyToOne(type => View, { nullable: true })
@JoinColumn({name: 'view_id'})
view: View;
}
Run Code Online (Sandbox Code Playgroud)
似乎已经解决的关键区别是我在@PrimaryGeneratedColumn()装饰器中指定了“uuid” 。这令人惊讶,因为这些字段实际上在数据库中被正确创建为 UUID,但似乎 TypeORM 假定关键字段是整数,除非您明确指定类型,即使它知道如何创建正确的数据字段本身的类型。
编辑:经过仔细检查,结果发现 @Generated('uuid') 实体是多余的,因此上面基类的代码可以简化为:
export class AgentKitsEntity implements Model {
@PrimaryGeneratedColumn('uuid')
id: string;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4423 次 |
| 最近记录: |