使用Sequelize向MSSQL插入数据时遇timestamp列报错求助
问题解答
报错根源
- 表结构与模型定义不一致:尽管你在模型中设置了
timestamps: false,但实际数据库里的Hotel_Owner和User_Hotel中间表可能存在created_at/updated_at这类timestamp字段(可能是手动建表或旧迁移脚本残留)。直接调用中间模型的create()方法时,Sequelize未自动排除这些字段,导致尝试插入非法值,触发数据库报错。 - 异步操作未处理:
create()、findOrCreate()都是异步Promise操作,你没有用await等待结果,导致hotel、owner是Promise对象而非实例,取id会得到undefined,进一步引发插入逻辑异常。 - 中间表插入方式不规范:使用
belongsToMany关联后,直接操作中间模型并非最优解,容易忽略关联逻辑和字段校验。
修复方案
1. 对齐表结构与模型
检查Hotel_Owner和User_Hotel表结构:
- 若不需要timestamp字段,直接删除表中的
created_at/updated_at; - 若需要保留,在中间模型中手动定义字段并设置默认值:
class Hotel_Owner extends Model {} Hotel_Owner.init({ id: { type: Sequelize.INTEGER, primaryKey: true, autoIncrement: true }, created_at: { type: Sequelize.DATE, defaultValue: Sequelize.NOW }, updated_at: { type: Sequelize.DATE, defaultValue: Sequelize.NOW } }, { sequelize, timestamps: false }); // 保持timestamps关闭,避免自动生成字段
2. 正确处理异步操作
所有异步方法需用await包裹,确保拿到有效模型实例(代码需放在async函数内):
const hotel = await Hotel.create({name:"WestIn"}); const [owner, created] = await Owner.findOrCreate({where:{name:"John Doe"}}); const user = await Users.create({name:"Common man"});
3. 使用关联方法插入中间表数据
推荐通过模型的关联方法自动处理中间表,避免手动操作的失误:
// 关联业主与酒店 await owner.addHotel(hotel); // 关联用户与酒店 await user.addHotel(hotel);
若坚持手动操作中间模型,需指定插入字段,排除timestamp列:
await Hotel_Owner.create( {OwnerId: owner.id, HotelId: hotel.id}, {fields: ['OwnerId', 'HotelId']} // 仅插入指定字段 );
内容的提问来源于stack exchange,提问作者Vivek Anand
相关产品推荐
相关产品推荐

