如何为 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
。
我有一个用例需要在我的表中使用自定义字符串主键。 (我不想使用 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
。