首页 > 解决方案 > 如何按顺序执行一系列 SQL 命令?

问题描述

我正在将MySQL 用于 NodeJS并尝试执行以下操作:

dbQueries = ['multiple', 'sql', 'statements', 'that', 'need', 'to', 'be', 'executed', 'in', 'order'];
executedQueries = 0;
dbConn = mysql.connect();
maxQueries = dbQueries.length;
dbQueries.forEach(async (dbQuery)  => {
  console.log("Start");
  return dbConn.query(dbQuery, function(err, results, fields) {
    console.log("Finish");
    if (err) {
      errorList.push({ err, results, fields, dbQuery });
    }
    executedQueries++;

    if (executedQueries >= maxQueries) {
      if (errorList.length > 0) {
        console.log("Error: ", databaseTable.name, "  Errors reported: ", errorList);
      }
      if (typeof(callbackFunc) === 'function') { callbackFunc(errorList, executedQueries); }
    }
  });
});

但最终发生的是,有时查询会乱序完成。我知道这一点是因为我设置了列,然后通过添加主键等来修改表,有时会出现Table 'blah.blah' doesn't exist. 错误每次都会改变。我可以看到这一点,因为Start在看到多个Finishes 之前有多个 s。不确定我是否正确使用异步。

multipleStatements如果可能,我不想打开。

标签: mysqlnode.jsforeachsynchronous

解决方案


您看到意外结果的主要原因是 nodejs 异步执行这些查询。运行多个查询的正确方法:

dbQueries = ['multiple', 'sql', 'statements', 'that', 'need', 'to', 'be', 'executed', 'in', 'order'];
dbConn = mysql.connect();
function runQueries(dbQueriesArr) {
    if(dbQueriesArr.length === 0)
        return;
    var dbQuery = dbQueriesArr[0];
    dbConn.query(dbQuery, function(err, results, fields) {
        if (err) {
            errorList.push({ err, results, fields, dbQuery });
        }
        var dbQueriesArr_rest = dbQueriesArr.splice(1);
        runQueries(dbQueriesArr_rest);
    });
}
runQueries(dbQueries);

推荐阅读