如何在TypeORM实体中为@PrimaryGeneratedColumn设置自定义默认唯一ID字符串?

时间:2018-09-04 01:48:41

标签: javascript entity typeorm

我有一个用例,要求在表中使用自定义字符串主键。 (我不想使用GraphQL提供的默认'uuid',而是想使用shortid library来生成自定义唯一ID。)

我是TypeORM的初学者,我在文档中找不到有关设置自定义默认主键的任何信息。是否可以在TypeORM PrimaryGeneratedColumn中实现我想要的功能,还是必须通过其他方式完成我想要的功能?

更新:我了解到可以在保存实体之前使用@BeforeInsert listener修改实体,但是TypeORM仍然不允许我覆盖PrimaryGeneratedColumn('uuid')并使用shortId字符串,因为shortId字符串不是有效的uuid。

2 个答案:

答案 0 :(得分:4)

使用SQLite时,

@Timshel的答案不起作用,因为默认值必须恒定。它给出以下错误:

UnhandledPromiseRejectionWarning: QueryFailedError: SQLITE_ERROR: default value of column [id] is not constant

相反,您可以使用@BeforeInsert来获得所需的结果,如下所示:

@Field(() => ID)
@PrimaryColumn("varchar", {
  length: 20
})
id: string;

@BeforeInsert()
setId() {
  this.id = shortid.generate();
}

答案 1 :(得分:2)

@PrimaryGeneratedColumn('uuid')装饰器将列映射到uuid数据库字段类型(如果数据库支持的话),这意味着列值必须是有效的UUID。

对于您的情况,我建议使用以下装饰: typescript @PrimaryColumn('varchar', { length: <max shortId length>, default: () => `'${shortid.generate()}'` })