sequelizejs update不会忽略空值

时间:2018-01-18 13:38:47

标签: node.js sequelize.js

要更新的代码:

            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,但更新不会。

如何更新以忽略空值。

4 个答案:

答案 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代码中看到,他们做类似的事情