循环查询执行

在iam下方,使用

数组调用addUpdateDailyLeads
[{
    "yyyymmdd": "20191124","admin_login":"rasheed.s","category":"PO","amount":10,"office_id":10000,"new_leads_attempted":10
},{
    "yyyymmdd": "20191124",{
    "yyyymmdd": "20191125","admin_login":"prajeed.av","category":"FHL","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,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


最后,我需要等待每个项目,执行所有查询,然后处理下一个项目

xqxqwps 回答:循环查询执行

我认为您可以通过在更新上使用await并创建语句来解决....

还要看一下UPSERT方法,它可以大大简化您的代码。从 The Sequelize API Reference:“插入或更新单行。如果找到与主键或唯一键上提供的值匹配的行,则将执行更新。”

附录:用于同步异步/等待,有许多方法可以执行此操作,如in this post所述。这是我按照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)id = 1的第二次出现反映了第一次出现的更新。 c)最终的findAll反映所有插入和更新。

HTH

本文链接:https://www.f2er.com/2706894.html

大家都在问