Sequelize: обновляются только последние несколько строк - PullRequest
0 голосов
/ 19 января 2019

У меня есть массив (несколько тысяч) объектов данных, которые мне нужно вставить или обновить в зависимости от условия. Простой 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).

Новый вопрос: я больше не изучал метод обновления сиквелиза, но это ошибка или я здесь что-то не так делаю?

1 Ответ

0 голосов
/ 19 января 2019

Как подробно описано в закомментированном коде ниже, ваш журнал находится после вашего возврата и поэтому никогда не будет выполнен.

Также вы не использовали 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

Возможно, это поможет вам найти причину неожиданного поведения.

...