【问题标题】:How can I interrupt a loop on a MySQL query when the are no affected rows?当没有受影响的行时,如何中断 MySQL 查询的循环?
【发布时间】:2021-08-10 12:52:23
【问题描述】:

我有一个需要循环遍历的对象数组。 对于每个对象,我需要执行 MySQL INSERT IGNORE 类型的查询。 问题是我必须停止循环,因为我看到我从数组中存在的对象之一获得的数据已经存在于数据库中,检查 mysql 附带的results 对象上的affectedRows 属性。

cont arrayOfObjects = [{foo: foo, bar: bar}, {foo: foo1, bar: bar1}];

for(obj of arrayOfObjects){
   let sql = `INSERT IGNORE INTO TABLE table_name VALUES(${obj.foo}, ${obj.bar});`;
   connection.query(sql, (error, results, fields) => {
       if(results[0].affectedRows === 0){
           // I want to stop looping
       }
   }  
}

【问题讨论】:

    标签: mysql node.js express


    【解决方案1】:

    为此,您可以逐个运行更新操作并检查结果。

    例如:

    async function runUpdates() {
      const arrayOfObjects = [{foo: foo, bar: bar}, {foo: foo1, bar: bar1}];
      const needToStop = false;
      for (const obj of arrayOfObjects) {
         if (!needToStop) {
            const updated = await runQuery(obj);
            if (updated > 0) { needToStop = true; }
         }
      }
      return 'OK';
    }
    
    
    
    function runQuery(obj) {
      return new Promise((resolve, reject) => {
           let sql = `INSERT IGNORE INTO TABLE table_name VALUES(${obj.foo},${obj.bar});`;
         connection.query(sql, (error, results, fields) => {
             if (error) { return reject(error);}
             resolve(results[0].affectedRows);
         });
     })
    }
    

    【讨论】:

    • 当查询每次都返回完成时的回调时,有点过分了,哎呀!不要双重承诺,这对于任务来说代码太多了。
    【解决方案2】:

    function CallMeMaybe() {
                    connection.query(sql, (error, results, fields) => {
                        if (results[0].affectedRows === 0) {
                            // I want to stop looping
                        } else {
                            setTimeout(() => {
                                CallMeMaybe();
                            }, 1000);
                        }
                    });  
    }
    CallMeMaybe();

    我不会循环它,而是在满足条件时调用它——再次!

    【讨论】:

    • 详细来说,查询调用是承诺的,函数中有回调对吗?因此,如果您等待它的完成并重复,当结果是肯定的时,它会完美无缺。所以只需函数包装它并根据我上面的示例重复调用函数,看看它是如何进行的,不需要双重承诺;只是锁定事件循环......又名滞后。
    猜你喜欢
    • 2018-05-13
    • 1970-01-01
    • 2010-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-10
    • 2016-10-14
    • 1970-01-01
    相关资源
    最近更新 更多