如何通过sequelize-typescript注解使用UUID作为主键类型?
报错原因
invalid input syntax for integer: "6ecfcc0e-b0de-4991-bf45-e190534293c2"是字段类型不匹配导致的,你现有代码有三个核心问题:
- 外键字段
buildId只加了@ForeignKey装饰器,没有通过@Column显式声明字段类型,sequelize-typescript会默认将其推断为整数类型,和你实际要存的UUID字符串类型冲突 - 关联的
SequelizeBuildModel主键没有同步修改为UUID类型,关联查询时Sequelize会按整数类型解析关联键,传入UUID字符串直接触发类型校验错误 - 如果已经修改过模型定义但没同步数据库结构,数据库中对应字段依旧是INT类型,写入UUID时也会直接抛这个错
正确实现方案
第一步:统一修改所有关联模型的主键为UUID类型
先修改被关联的父模型SequelizeBuildModel的主键定义,不要只改单表的主键:
import { Model, PrimaryKey, Column, DataType, IsUUID } from 'sequelize-typescript'; export class SequelizeBuildModel extends Model<BuildModelAttributes> { @IsUUID(4) @PrimaryKey @Column({ type: DataType.UUID, defaultValue: DataType.UUIDV4, allowNull: false, }) id!: string; // 其余业务字段保持原有定义即可 }
第二步:修正当前迭代模型的字段定义
重点是给外键buildId加上@Column装饰器显式指定UUID类型,同时把TS类型从number改成string,移除主键配置的冗余项:
import { Model, PrimaryKey, Column, DataType, IsUUID, BelongsTo, ForeignKey } from 'sequelize-typescript'; export class SequelizeIterationModel extends Model<IterationModelAttributes> { @IsUUID(4) @PrimaryKey @Column({ type: DataType.UUID, defaultValue: DataType.UUIDV4, allowNull: false, }) id!: string; @BelongsTo(() => SequelizeBuildModel) build!: SequelizeBuildModel; @ForeignKey(() => SequelizeBuildModel) @Column({ type: DataType.UUID, allowNull: false }) buildId!: string; @Column({ type: DataType.JSON }) config!: Record<string, unknown>; }
第三步:同步数据库表结构
- 开发环境:执行
sequelize.sync({ force: true })自动重建表结构,注意该操作会清空表内现有数据 - 生产环境:编写迁移脚本,手动将关联表的主键、外键字段类型从整数修改为对应数据库支持的UUID类型,配置默认值为UUIDv4生成函数即可
冗余提示:
@PrimaryKey装饰器已经完成主键声明,不需要在@Column配置里重复写primaryKey: true。
内容的提问来源于stack exchange,提问作者A Mehmeto
相关产品推荐
相关产品推荐

