mysql - 如何按顺序执行一系列 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
在看到多个Finish
es 之前有多个 s。不确定我是否正确使用异步。
multipleStatements
如果可能,我不想打开。
解决方案
您看到意外结果的主要原因是 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);
推荐阅读
- r - r - 每个点而不是单个数据点的散点图汇总统计信息(例如总和或平均值)
- python - 如何将 pandas DataFrame 传递给 PostgreSQL 函数(存储过程)?
- rust - 在 actix-web 路由处理程序中使用预先计算的大对象
- angular - 将事件传递/发射到父组件?
- python - Python 通过引用 DLL 传递用户定义的类
- python - Django中ImageField的错误路径
- python - Pandas Dataframe MultiIndex 将多索引的一个级别转换为另一个轴,同时将另一个级别保持在原始轴中
- sql - 与当前订单排名
- android - SQLite 数据库 Android 应用程序在模拟器中运行良好,而不是在我的设备中
- julia - Julia:在断言中添加自定义消息?