私はリレーショナルDBをリレーショナルDBにしようとしています。だから私は一意のIDのないデータから始めています。Node.js連鎖はMySQLのループで約束します
これらの行を介して1つのSQL呼び出しループから結果を取得する必要があり、それぞれについて、最初の結果の一部を使用してSQL SELECTを実行し、次に次の結果を使用して別のSQLを選択し、最初と最後のクエリから。
私はNode.jsを使用しており、ES6はすべてを順番に保つことを約束していますが、何か不足しているようです。私は実際に余分なSQL呼び出しを行い、その結果を3番目のクエリで使用しようとしていましたが、もう1つの呼び出しを別の呼び出しに渡すだけで単純化しています。
多分、いくつかのコードは私が何をしようとしているのかを示す助けになるでしょう。ここで
は約束を返す私のクエリクラスです:
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です:今コンソールで、私は続く有効な組織オブジェクトは、取得します。 2番目のクエリの前に割り当てられているcontactIdを取得するにはどうすればよいですか。私はこの非同期のことを正しくやっていないことを知っています。
私はそれをきれいにしなければなりませんでした。例えば、結果[i]はselectOrgの約束ではなくforループの中にあるべきです。その時点で必要なのは「結果」だけです。しかし、私はまだすべての組織が同じcontactId(17848)にリンクしています。これは最後のcontactIdです。 – ScottM
あなたのコードは悪くはありませんでした。私はそれをかなり速く走らせることができました。しかし、それは上記の元のコードと同じ結果を生成します。 – ScottM
@ScottM質問を正しく読まなかった。私は「2番目のクエリの前に割り当てられているcontactIdを取得するにはどうすればよいですか」と理解していません。 – Muthukumar