使用不同条件更新sequelize中的多行

时间:2018-04-04 04:53:39

标签: javascript postgresql sequelize.js

我试图在postgres数据库中的行上使用sequelize执行更新命令。我需要能够使用相同的值更新具有不同条件的多个行。

例如,假设我有一个包含以下字段的用户表:

  • ID
  • 名字
  • 姓氏
  • 性别
  • 位置
  • createdAt

假设我在这张表中有4条记录,我想更新ID为1的记录和4,新的位置是尼日利亚。

这样的事情:SET field1 = 'foo' WHERE id = 1, SET field1 = 'bar' WHERE id = 2

如何用sequelize实现这一目标?

3 个答案:

答案 0 :(得分:6)

您可以一次更新多条记录,但所有记录的更新都相同 ,如果你想为不同的条件做出不同的更新,那么你必须多次运行

示例:

这会将fields1更新为foo,其中id为1或4

let ids = [1,4];
Your_model.update({ field1 : 'foo' },{ where : { id : ids }}); 

如果field1为1,则会将id更新为foo;如果field1为4,则id会更新为

Your_model.update({ field1 : 'foo' },{ where : { id : 1 }});
Your_model.update({ field1 : 'bar' },{ where : { id : 4 }}); 

希望这能清除你所有的疑虑。

答案 1 :(得分:2)

我们计划为多行中的相同字段保存不同的值,有可能使数据库中的所有字段值都相同。 使用for循环

const {idArray,group_id} = params;

for(const item of idArray){

    const response = await Your_model.findOne({ where:{group_id,user_id:null}, order: [['id', 'DESC']] });

    await response.update({user_id:item});
}

答案 2 :(得分:1)

您可以根据条件更新多行,并且这样做对操作员很有帮助。

查看此处:http://docs.sequelizejs.com/manual/querying.html(操作员)

const { Op } = Sequelize;
DisplayMedia.update(
    {
        field: 'bar'
    },
    {
        where: {
            id: {
                [Op.in]: [1, 10, 15, ..]   // this will update all the records 
            }                           // with an id from the list
        }
    }
)

有各种各样的运算符,包括范围运算符或类似的运算符... etc

更新时的重要问题之一是如何更新所有行?

不包含where会导致错误“ 在传递给更新的options参数中缺少where属性”。

答案在下面的代码中:为where提供一个空对象

await DisplayMediaSequence.update({
    default: false
}, {
    where: {}, // <-- here
    transaction
});
await DisplayMediaSequence.update({ 
    default: true     <-- after all turned to false, we now set the new default. (that to show a practical expample) -->
}, {
    where: {
        id
    },
    transaction
});