gpt4 book ai didi

mysql - Sequelize : only the last few rows are updated

转载 作者:行者123 更新时间:2023-11-29 16:25:46 25 4
gpt4 key购买 nike

我有一个(几千个)数据对象数组,需要根据条件插入或更新。我的模型类中实现了一个简单的 upsert() 方法。

实现

    csv.upsert = async function (values, condition) {
let obj = await csv.findOne({ where: condition });

if (obj) {
// update
console.log("existing record updated")
return await obj.update(values);
} else {
// insert
console.log("new record inserted")
return await csv.create(values);
}

}

然后使用此 upsert 方法,我循环遍历对象数组以在数据库中插入或更新它们。

使用

try {           
await models.sequelize.authenticate();
await models.sequelize.sync();
let dataToBeInserted = getArrayOfDatatoInsert();
dataToBeInserted.map(async function (data) {
let condition = {
'categorygroup': data.categorygroup,
'category': data.category,
'country': data.country,
'city': data.city
};
await csvModel.upsert(data, condition);
})
// await restofthestuff();
} catch (error) {
console.log("error", error);
}

为了进行测试,我获取了一个数据集,其中的所有数据都需要更新。

当我运行此方法时:

我可以在日志中看到(随着 Sequelize 日志打开),为每个存在的记录打印了“现有记录已更新”消息,这是所需的输出。数据库中仅更新最后几个 (30) 数据。它适用于 csv.create(values) 的地方

~ 我怎样才能更新所有记录,显然不仅仅是最后 30 条数据,任何帮助都是值得赞赏的。 〜

EDIT: Apparently I got this to work by using csv.update(values, {where: condition}) instead of using obj.update(values).

New question: I didn't look further into the sequelize's update method but is this a bug or am I doing something wrong here?

最佳答案

正如下面注释代码中详细说明的,您的日志是在您返回之后,因此永远不会被执行。

此外,您没有在异步函数中使用await,因此要么不要使其异步,要么使用await。

csv.upsert = async function (values, condition) {
const obj = await csv.findOne({ where: condition });
// you can await here, no need for then as you are in an async function

if (obj) { // update
// you need to log before your return condition
console.log("existing record updated")
return obj.update(values);
// since we return here, the rest of the code will not be executed
// you can skip the use of else
}
// we are in this part of the code only if object is falsy

// insert
console.log("new record inserted")
return csv.create(values);
}

您还可以使用 Promise.all 来确保完成所有更新插入:

await Promise.all(dataToBeInserted.map(async function (data) {
let condition = {
'categorygroup': data.categorygroup,
'category': data.category,
'country': data.country,
'city': data.city
};
await csvModel.upsert(data, condition);
}))

这也将确保如果发生错误,它会被您的 try/catch 捕获

也许这会帮助您找到导致意外行为的原因。

关于mysql - Sequelize : only the last few rows are updated,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54266261/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com