2016-11-07 12 views
0

この2層のクエリはnode.jsにあり、各クエリは複数の結果を返す可能性があります。私のコードは実際には今のところそれを無視しています。これは私が得ることができる最高です、それは働いているようです。sqlite3でネストされたクエリを実装する方法

  1. これを修正するにはどうすればいいですか、第2のコールバックの方法はわかりません。

  2. また、db.close()は、第2のクエリが終了する前に呼び出されます。シリアル化されていても()です。

    var getInfo1Db = function(コールバック){ 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 
    
    }); 
    

    }

+0

を助けます最初のクエリ)? – dmg

+0

@dmg私は実際の問題を単純化し、各クエリは複数の結果を返すことができました。そして2番目のクエリは前の結果を使用し、次に3番目のクエリが使用します...最後に、私はちょうどこれらをperlで行い、node.jsはperlを呼び出します。 – user3552178

答えて

0

どのように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 
    }); 
}); 

希望、これはあなたがより多くの各タプルごとに別のクエリのような単一のクエリの代わりに、2を(書いていない理由:)

関連する問題