我有一个用例,要求在表中使用自定义字符串主键。 (我不想使用GraphQL提供的默认'uuid',而是想使用shortid library来生成自定义唯一ID。)
我是TypeORM的初学者,我在文档中找不到有关设置自定义默认主键的任何信息。是否可以在TypeORM PrimaryGeneratedColumn中实现我想要的功能,还是必须通过其他方式完成我想要的功能?
更新:我了解到可以在保存实体之前使用@BeforeInsert listener修改实体,但是TypeORM仍然不允许我覆盖PrimaryGeneratedColumn('uuid')并使用shortId字符串,因为shortId字符串不是有效的uuid。
答案 0 :(得分:4)
@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()}'` })