[英]How to implement nested query in sqlite3
所以我在 node.js 中有這個 2 層查詢,每個查詢可以返回多個結果。 我的代碼實際上只是暫時忽略了這一點。 這是我能得到的最好的,它似乎有效。
請如何更正,我不知道如何回調第二個。
此外 db.close() 總是在第二個查詢完成之前調用,即使我有 serialize()。
var getInfo1Db = function(callback) { var db = new sqlite3.Database("DB.sqlite3");
var cnt = 0; var info1JsonObj = []; db.all("select * from Info1DB", function(err, rows) { db.serialize(function() { for(var ii=0, len=rows.length; ii<len; ii++) { var t2 = rows[ii].info1; var doorId = ... db.all("select * from DoorDB where ObjectID=" + doorId, function(err, row2) { if(err) { } else { var doorName = row2[0]... var info1JsonElem = { "DoorName" : doorName }; info1JsonObj.push(info1JsonElem); cnt++; if(cnt === rows.length) { callback(null, info1JsonObj); } } } ); // for the only door info based on door id } // for each row of info1 db.close(); // why this finishes before the 2nd db.all } ); // end of serialize });
};
使用 2 個函數來做這些怎么樣?
function db_query1(your_param,...., callback){
// database operation
db.run( sql , [param,...] , function(err,rows){
if(err) // return
else{
// get rows with callback
callback(null, rows);
}
});
}
function db_query2(your_param,...., callback){
// database operation
db.run( sql , [param,...] , function(err,rows){
if(err) // return
else{
// get rows with callback
callback(null, rows);
}
});
}
並調用這些函數:
db_query1(....,function(err,result1){
if(err) ...// return
// do the things with result1
// And then call query2
db_query2(....,function(err,result2){
if(err) ...// return
// do the things with result1
});
});
希望這會有所幫助:)
您可以使用Promises.all
,一個數組和節點 sqlite3 db.each()
的第二個回調,當所有行都被提取時執行。 Node Sqlite3 db.each 用法,簡化嵌套查詢和
我真的不能得到你所使用的變量的含義因此,我認為在每一行Info1DB
有一個一對多的關系DoorDB
場上doorId
。
async function getInfo (callback) {
sql = "select * from Info1DB;";
numVersions = 0;
countVersions = 0;
info1JsonObj = [];
db.serialize(function() {
db.each(sql, [], (err, info1Row) => {
sql = "select * from DoorDB where ObjectID=?;";
info1Row.doors = [];
doorId = ...
db.each(sql, [doorId], (err, doorRow) => {
info1Row.doors.push(new Promise((resolve, reject) => {
if (err) {
reject(err);
} else {
resolve(doorRow);
}
}));
}, (err, num) => {
Promise.all(info1Row.doors)
.then((doors) => {
info1Row.doors = doors;
info1JsonObj.push(info1Row);
countVersions++;
if (countVersions == numVersions) {
callback(null, info1JsonObj);
}
}).catch((err) => {
callback(err, null);
});
});
}, (err, versions) => {
numVersions = versions;
});
});
}
您不能以 sqlite3 的正常方式實現嵌套查詢。 (我的意思是你甚至不能以callback hell
方式做到這一點,因為sqlite3
需要在調用另一個查詢之前關閉連接。否則你總是會出錯)
你必須使用Promise
、 async
和await
來做到這一點。 (花30分鍾學習這3個詞是值得的)
步驟一。 像這樣定義一個異步函數:
async query_1() {
new Promise(resolve => {
db = ...
db.serialize( () => {
db.get('select .. from ... where id = 1', [], (error, row) => {
// here is the KEY: put the result into resolve
// this equals to the "return" statement in non-sync method.
resolve(row)
}
})
db.close()
})
}
並像這樣實現你的 query_2 函數:
async query_2() {
let query_1_result = await this.query_1()
db = ...
db.serialize( () => {
db.get('select .. from ... where dependency_id = ' + query_1_result, [], (error, row) => {
// other code here...
}
})
db.close()
}
參考我的回答: https : //stackoverflow.com/a/67881159/445908
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.