You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 14:06:23