У меня есть массив (несколько тысяч) объектов данных, которые мне нужно вставить или обновить в зависимости от условия. Простой 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, где я перебираю массив объектов, чтобы вставить или обновить их в БД.
Usage
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) я вижу, что сообщение "existing record updated"
печатается для каждой существующей записи, которая является желаемым выходом. Только последние несколько (30) данных обновляются в БД. Где как это работает для csv.create (values)
~ Как я могу обновить все записи и, очевидно, не только последние 30 данных, любая помощь приветствуется. ~
РЕДАКТИРОВАТЬ: Очевидно, я получил это для работы с помощью csv.update(values, {where: condition})
вместо obj.update(values)
.
Новый вопрос: я больше не изучал метод обновления сиквелиза, но это ошибка или я здесь что-то не так делаю?