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

m_d*_*ney 5 javascript entity typeorm

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

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

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

Tim*_*hel 10

所述@PrimaryGeneratedColumn('uuid')装饰映射列到uuid数据库是否支持它的数据库字段类型,这意味着该列的值必须是一个有效的UUID。

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


小智 5

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

UnhandledPromiseRejectionWarning: QueryFailedError: SQLITE_ERROR: default value of column [id] is not constant
Run Code Online (Sandbox Code Playgroud)

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

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

@BeforeInsert()
setId() {
  this.id = shortid.generate();
}
Run Code Online (Sandbox Code Playgroud)