Sequelize Выполнение запроса в цикле - PullRequest
0 голосов
/ 27 января 2020

Ниже я вызываю addUpdateDailyLeads с массивом, подобным

[{
    "yyyymmdd": "20191124",
    "admin_login":"rasheed.s",
    "category":"PO",
    "amount":10,
    "office_id":10000,
    "new_leads_attempted":10
},
{
    "yyyymmdd": "20191124",
    "admin_login":"rasheed.s",
    "category":"PO",
    "amount":10,
    "office_id":10000,
    "new_leads_attempted":10
},
{
    "yyyymmdd": "20191125",
    "admin_login":"prajeed.av",
    "category":"FHL",
    "amount":10,
    "office_id":10000,
    "new_leads_attempted":10
}
]

Таким образом, ключ 0 должен быть вставлен, ключ 1 должен обновляться, потому что дублирование ключа, ключ 2 будет вставлен,

, но я получаю ошибка ограничения повторяющегося ключа на ключе 1, поскольку карта массива не ожидает выполнения запроса.

const addUpdateDailyLeads = async (req, res) => {
  let admin_login,category,office_id,new_leads_attempted,yyyymmdd,where,values;
  let data = req.body;

  req.body.map(async function(item,i){
    admin_login = item.admin_login,
    category = item.category,
    office_id = item.office_id,
    new_leads_attempted = item.new_leads_attempted,
    yyyymmdd    = item.yyyymmdd;
    where = {yyyymmdd:yyyymmdd, admin_login:admin_login, category:category};
    values = {yyyymmdd:yyyymmdd, admin_login:admin_login, category:category,office_id:office_id,new_leads_attempted:new_leads_attempted,update_date:moment().format('YYYYMMDDHHmmss')};
    console.log("calling  ",i);
    let chck = await addUpdateDailyLeadsCollection({where:where,values:values})
    console.log("")
    console.log("called")
  })

  res.json({ code: '200', message: `Advisor Daily Leads Updated ${admin_login}` });

}


const addUpdateDailyLeadsCollection = async data => {
  let transaction;    
  let where = data.where
  let values = data.values
  var Sequelize = require("sequelize");
  console.log("startef 1");
  await AdvisorLeads.findOne({ where: where }, { useMaster: true }).then( async(data)=>{
    console.log("waited");
    if(data){
          await data.update({new_leads_attempted: Sequelize.literal('new_leads_attempted + '+values.new_leads_attempted)}).then(data=>{
           console.log("updated")
           return Promise.resolve(1);
         })
    }else{
        AdvisorLeads.create(values).then(data=>{
           console.log("inserted")
           return Promise.resolve(1);
        })
    }
  })


};

окончательный вывод на консоль

calling   0
startef 1
waiting 1
calling   1
startef 1
waiting 1
calling   2
startef 1
waiting 1
waited
waited
waited
called

called

called

inserted
inserted
My expected output like
calling   0
startef 1
waiting 1
waited
inserted
called

calling   1
startef 1
waiting 1
waited 
updated
called

calling   2
startef 1
waiting 1
waited
inserted
called


Наконец то, что мне нужно, это ждать каждого элемента, выполнить все запросы и затем обработать следующий элемент

1 Ответ

0 голосов
/ 27 января 2020

Я думаю, что вы можете решить, используя await для обновления и создания операторов ....

Но также взгляните на метод UPSERT, который может немного упростить ваш код. С Ссылка Sequelize API : «Вставьте или обновите одну строку. Обновление будет выполнено, если найдена строка, которая соответствует предоставленным значениям либо первичного ключа, либо уникального ключа.»

Приложение : для синхронизации async / await есть много способов сделать это, как описано в этом посте . Вот некоторый код, который я настроил, следуя методу ES7:

let params = [{id : 1, sal : 10}, {id : 44, sal: 30}, {id : 1, sal : 20}];

async function doUpsertArrayInSequence(myParams) {

    let results = [];
    for (let i = 0; i < myParams.length; i++) {
        let x = await User.findByPk(myParams[i].id).then(async (u) => {
            if (u != null) {
                await u.update({ sal : u.sal + myParams[i].sal});
            } else {
                await User.create({id: myParams[i].id, sal: myParams[i].sal});                    
            }
        });
        results.push(x);
    }
    return results;
}
await doUpsertArrayInSequence(params).then(function(result) {
    User.findAll().then(proj => {
        res.send(proj);
        next();
    });    
})

Из журнала я вижу a) SELECT, за которым следуют UPDATE или INSERT для каждой строки (последовательно). b) 2-е вхождение id = 1 отражает обновление 1-го вхождения. c) В окончательном поиске отображаются все вставки и обновления.

HTH

...