要更新的代码:
return db.models.sprout.update({
first_name: args.input.patch.first_name,
last_name: args.input.patch.last_name,
date_of_birth: args.input.patch.date_of_birth,
image_url: args.input.patch.image_url,
updated_by: args.input.user_id
},{ where: { sprout_id : args.input.sprout_id }}).then((rowsUpdated) => {
表中没有任何字段没有空约束。
理想情况下,这应该只更新,args.input.patch中提供的值,我只提供image_url
我收到此错误。
notNull Violation: sprout.first_name cannot be null,\nnotNull Violation: sprout.last_name cannot be null
return db.models.sprout.create({
sprout_id: uuidv4(),
first_name: args.input.sprout.first_name,
last_name: args.input.sprout.last_name,
date_of_birth: args.input.sprout.date_of_birth,
image_url: args.input.sprout.image_url,
created_by: args.input.user_id
})
如果我不提供image_url或任何其他字段,插入工作正常,并忽略null,但更新不会。
如何更新以忽略空值。
答案 0 :(得分:1)
sequelize中有这样的东西:omitNull
,你应该把它设置为true。请在文档中查看:http://docs.sequelizejs.com/class/lib/model.js~Model.html
但是在这里:https://github.com/sequelize/sequelize/issues/2352他们团队的工程师说" omitNull是一个肮脏的黑客,现在有更好的方法来解决它。"并且他没有推荐正确的方法。
就个人而言,我建议您在将对象传递给sequelize之前清除对象中的空字段。请看这个主题:Remove blank attributes from an Object in Javascript
答案 1 :(得分:1)
我建议只传递您真正想要更新的字段。这将使代码更具可读性。
将字段传递给下面的函数。此函数将返回仅包含非空字段的新对象
const getFieldsToUpdate = (fields) => {
return {
...fields.first_name && { first_name: fields.first_name },
...fields.last_name && { last_name: fields.last_name },
...fields.date_of_birth && { date_of_birth: fields.date_of_birth },
...fields.image_url && { image_url: fields.image_url },
...fields.user_id && { updated_by: fields.user_id },
}
};
const fieldsToUpdate = getFieldsToUpdate(args.input.patch);
return db.models.sprout.update(fieldsToUpdate, {
where: { sprout_id : args.input.sprout_id }
})
.then((rowsUpdated) => {...
答案 2 :(得分:1)
错误似乎是由于参数allownull设置为true ...
答案 3 :(得分:0)
好点ashish。哇,很好理解,这是因为某些字段上的allownull设置为false。我删除后尝试了,它按预期工作。 ashish和Michael解决方案都有效。我更喜欢Ashish解决方案,因为它更原生,过滤是通过sequelize而不是自定义代码完成的(感谢Michael代码),我在sequilze代码中看到,他们做类似的事情