如何按顺序执行sql命令列表?

6mw9ycah  于 2021-06-23  发布在  Mysql
关注(0)|答案(1)|浏览(352)

我在nodejs中使用mysql,并尝试这样做:

  1. dbQueries = ['multiple', 'sql', 'statements', 'that', 'need', 'to', 'be', 'executed', 'in', 'order'];
  2. executedQueries = 0;
  3. dbConn = mysql.connect();
  4. maxQueries = dbQueries.length;
  5. dbQueries.forEach(async (dbQuery) => {
  6. console.log("Start");
  7. return dbConn.query(dbQuery, function(err, results, fields) {
  8. console.log("Finish");
  9. if (err) {
  10. errorList.push({ err, results, fields, dbQuery });
  11. }
  12. executedQueries++;
  13. if (executedQueries >= maxQueries) {
  14. if (errorList.length > 0) {
  15. console.log("Error: ", databaseTable.name, " Errors reported: ", errorList);
  16. }
  17. if (typeof(callbackFunc) === 'function') { callbackFunc(errorList, executedQueries); }
  18. }
  19. });
  20. });

但最终的结果是,有时查询会以无序的方式结束。我之所以知道这一点,是因为我设置了列,然后通过添加主键等来修改表,有时会出现错误 Table 'blah.blah' doesn't exist . 错误每次都会改变。我可以看到这是因为有多个 Start 在看到多个 Finish 锿。不确定是否正确使用了异步。
我不想打开 multipleStatements 如果可能的话。

sauutmhj

sauutmhj1#

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

  1. dbQueries = ['multiple', 'sql', 'statements', 'that', 'need', 'to', 'be', 'executed', 'in', 'order'];
  2. dbConn = mysql.connect();
  3. function runQueries(dbQueriesArr) {
  4. if(dbQueriesArr.length === 0)
  5. return;
  6. var dbQuery = dbQueriesArr[0];
  7. dbConn.query(dbQuery, function(err, results, fields) {
  8. if (err) {
  9. errorList.push({ err, results, fields, dbQuery });
  10. }
  11. var dbQueriesArr_rest = dbQueriesArr.splice(1);
  12. runQueries(dbQueriesArr_rest);
  13. });
  14. }
  15. runQueries(dbQueries);

相关问题