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

How do you set a custom default unique id string for the @PrimaryGeneratedColumn in a TypeORM Entity?

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

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

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

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

对于你的场景,我建议装饰: typescript @PrimaryColumn('varchar', { length: <max shortId length>, default: () => `'${shortid.generate()}'` })

@Timshel 的回答在使用 SQLite 时不起作用,因为默认值必须是常量。它给出以下错误:

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();
}

非常感谢 Timshel 的回答 奥斯卡里·柳库!

他们的回答有一个补充。

最近,shortid弃用,在他们的主页上,他们建议使用 nanoid

nanoid on npm