【发布时间】:2018-05-26 14:55:39
【问题描述】:
我正在尝试将非关系数据库转换为关系数据库。所以我从没有唯一 ID 的数据开始。
我需要通过这些行从一个 SQL 调用循环中获取结果,并且对于每一行,使用第一个结果的一部分执行 SQL SELECT,然后使用下一个结果进行另一个 SQL 选择,然后使用来自的 ID 进行写入第一个和最后一个查询。
我正在使用 Node.js,ES6 承诺让一切井井有条,但我似乎遗漏了一些东西。我实际上是在尝试做一个额外的 SQL 调用,并在第三个查询中使用该结果,但我正在简化它,只让一个调用馈入另一个调用。
也许一些代码将有助于显示我正在尝试做的事情。
这是我返回承诺的查询类:
var mysql = require('mysql');
class Database {
constructor() {
this.connection = mysql.createConnection({
host: "localhost",
user: "root",
password: "root",
database: "pressfile"
});
}
query(sql, args) {
return new Promise((resolve, reject) => {
this.connection.query(sql, args, (err, result, fields) => {
if (err) return reject(err);
resolve (result);
});
});
}
close() {
return new Promise((resolve, reject) => {
this.connection.end(err => {
if (err) return reject (err);
resolve();
});
});
}
}
这几乎是从教程网站上偷来的,这部分似乎工作得很好。然后是循环和多个查询:
var contactId;
var address1;
var orgName;
var database = new Database();
database.query("SELECT * FROM contact")
.then( result => {
for (var i = 0; i < result.length; i++) {
contactId = result[i].contactId;
orgName = result[i].org;
var sql2 = "SELECT * FROM organization WHERE (name = \"" + orgName + "\")";
console.log(sql2);
database.query(sql2)
.then(result2 => {
console.log(result2);
var orgId = result2[0].organizationId;
var sql3 = "INSERT INTO contact_organization (contactId, organizationId) VALUES (" + contactId + ", " + orgId + ")";
console.log(sql3);
return ""; //database.query(sql3);
}).then( result3 => {
console.log(result3);
});
}
}).catch((err) => {
console.log(err);
databse.close();
});
我知道它在最后有点解开,但我不想做 INSERT 查询,直到我知道我能做对。现在在控制台中,我得到了一个有效的组织对象,然后是:
`INSERT INTO contact_organization (contactId, organizationId) VALUES (17848, 29)'
17848 是在 for 循环中返回的最终 contactId。如何获取在第二个查询之前分配的contactId。我知道我做这些异步的东西不对。
【问题讨论】:
标签: mysql node.js loops promise