Sequelize createXXXXX方法未自动填充外键引发非空约束报错
问题原因与解决方案
核心问题
你用office.createSeat(seat)的方式有误,createXxx系列方法的设计逻辑是接收普通属性对象来创建新实例,而非传入已通过Model.build()生成的模型实例。当传入已build的实例时,Sequelize不会自动为其填充外键,而是直接执行该实例的save()操作,而这个实例的office_id为null,触发了数据库的非空约束错误。
正确用法
方案1:直接用createSeat传入属性对象(推荐)
无需提前构建Seat实例,直接把属性对象传入createSeat,Sequelize会自动填充外键并完成保存:
let office = await Office.findByPk(1); let seat = await office.createSeat({ name: "Test", });
方案2:若已提前build实例,通过关联方法处理
如果已经用Seat.build()创建了实例,可通过以下方式关联并保存:
let office = await Office.findByPk(1); let seat = Seat.build({ name: "Test", }); // 方式1:手动设置外键后保存 seat.office_id = office.id; await seat.save(); // 方式2:使用关联方法绑定 await seat.setOffice(office); // 方式3:用addSeat添加已构建的实例 await office.addSeat(seat);
内容的提问来源于stack exchange,提问作者hobberwickey
相关产品推荐
相关产品推荐

