TypeORM继承公共BaseEntity后新增自增certificateNo字段报错如何解决
问题根因
@Generated('increment')生成的是数字类型的自增序列,你将certificateNo定义为string类型且未给@Column指定匹配的字段类型,PostgreSQL中自增序列的返回值是数字类型,不能直接作为字符串类型字段的默认值,TypeORM自动生成的建表SQL不符合PG语法,就触发了NOT附近的语法错误。- 不加
@Column装饰器的话,TypeORM不会把该字段识别为数据库映射字段,自然不会在表中生成。
解决方案
方案1:证书编号为纯数字(推荐,最适配自增逻辑)
直接把certificateNo的类型改为number即可,代码如下:
@ApiProperty() @Column({ type: 'int' }) @Generated('increment') certificateNo: number;
如果业务需要拿字符串格式的编号,取值的时候直接String(certificateNo)转换即可。
方案2:需要字符串格式的自增编号(比如要加前缀、固定长度补零)
自定义PostgreSQL序列,然后通过序列生成值强制转成字符串类型,代码如下:
- 先在PostgreSQL中执行建序列语句:
CREATE SEQUENCE IF NOT EXISTS certificate_no_seq START WITH 1 INCREMENT BY 1;
- 调整实体字段定义:
@ApiProperty() @Column({ type: 'varchar', default: () => "nextval('certificate_no_seq'::regclass)::text", }) certificateNo: string;
如果需要自动创建序列,可以通过TypeORM的迁移文件统一管理序列和表结构。
内容的提问来源于stack exchange,提问作者Shruti sharma
相关产品推荐
相关产品推荐

