我正在尝试通过拉出7个字段并创建另一个表格匹配字段1,而其他6个字段是将数据放入新创建的字段中,从而从MySQL表处理数据桌子。字段1是设备的标识符,我想记录其他6个字段中其他信息的任何更改。例如...
表A
第1行---> 90:59:AF:4E:C3:30 |标记|10051 |pv320 |192.168.1.199 |1.35 |026132956282
第2行---> 90:59:AF:55:A3:BA |芽|10050 |PV200 |192.168.1.123 |1.37 |026132966540
我想创建
表90:59:AF:4E:C3:30
第1行--->标记|10051 |pv320 |192.168.1.199 |1.35 |026132956282
和.. -Table 90:59:AF:55:A3:BA
第1行--->芽|10050 |PV200 |192.168.1.123 |1.37 |026132966540
我遇到的问题是我有大约70个记录,当我尝试运行代码时,我无法等待它在创建和填充下一张表之前等待创建和填充第一个表。我知道我的语法是正确的,因为它会在投掷错误之前创建和填充几个表:er_con_count_error:太多连接'
这是我的代码:
function read_all_devices(){
var connection = mysql.createConnection({
host : db_host,
user : user,
password : pass,
database : my_db'
});
connection.query('SELECT macaddress, customer_name, ssh_port, validation_type, ip, version, serialnumber FROM ' + table + ' WHERE 1', function(err, rows) {
if (err) {
log(RED+err);
}
if (!err && rows[0]) {
rows.forEach(function(current){
var schema = mysql.createConnection({
host : db_host,
user : user,
password: pass,
database: 'information_schema'
});
schema.query("SELECT * FROM information_schema.tables WHERE table_schema = my_db AND table_name = '"+current.macaddress+"';", function(error, result) { //Check to see if the table already exists
if (error){
log("ERROR: " + error);
}
else if (result[0]) {
log("Table for " + current.macaddress + " already exists.");
update_historical_table(current.macaddress, current.customer_name, current.ssh_port, current.validation_type, current.ip, current.version, current.serialnumber);
}
else {
log("Table for " + current.macaddress + " did not exist....creating.");
create_table_by_mac(current.macaddress, current.customer_name, current.ssh_port, current.validation_type, current.ip, current.version, current.serialnumber, update_historical_table);
}
});
});
}
connection.end();
});
}
function create_table_by_mac(mac_to_create, name, port, val_type, ip, version, sn, printer, callback) {
var connection = mysql.createConnection({
host : db_host,
user : user,
password : pass,
database : my_db
});
connection.query("CREATE TABLE `" + mac_to_create + "` (recnum INT(10) NOT NULL AUTO_INCREMENT, customer_name VARCHAR(30) default NULL, ssh_port VARCHAR(6) default NULL, serialnumber VARCHAR(20) default NULL, validation_type VARCHAR(20) default NULL, ip VARCHAR(20) default NULL, version VARCHAR(20) default NULL, timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (recnum));", function (create_error, create_result) {
if (create_error) {
log("ERROR Creating Table: "+ create_error);
} else {
log("Table " + mac_to_create + " created");
}
});
callback(mac_to_create, name, port, val_type, ip, version, sn);
function update_historical_table(mac_to_update, name, port, val_type, ip, version, sn) {
var connection = mysql.createConnection({
host : db_host,
user : user,
password : pass,
database : my_db
});
connection.query("INSERT INTO `"+ mac_to_update + "` (`customer_name`, `ssh_port`, `validation_type`, `ip`, `version`, `serialnumber`, `printer_type`) VALUES ('" + name + "', '" + port + "', '" + val_type + "', '" + ip + "', '" + version + "', '" + sn + "');", function(err, rows) {
connection.end();
if (!err) {
log(GREEN+"Table "+ WHITE + mac_to_update + GREEN + " updated successfully.");
} else if (err) {
log(RED+"ERROR Updating "+ WHITE + mac_to_update + ".");
log(RED+"ERROR MESSAGE: " + err);
}
});
}
这是我可以获得粘贴代码的最好的。如果我在这里想做什么有任何疑问,请告诉我。
forEach
同步执行,但不会自动阻止所有内容。如果您在该块中进行异步工作,则forEach
不够聪明,无法等到回调完成。查看异步库,尤其是eachSeries
。看起来像这样:
var async = require('async');
async.eachSeries(rows, functionToHandleEachRow, functionToBeCalledAfterEverythingIsFinished);
您需要查看API,以获取有关迭代器和回调实现的更多详细信息。