Node.js 在sqlite3(节点包)中,如何按顺序运行多个查询?

Node.js 在sqlite3(节点包)中,如何按顺序运行多个查询?,node.js,sqlite,Node.js,Sqlite,我使用这个pakcage:sqlite3来操作数据库查询,代码如下: 单个查询非常简单: var sqlite3 = require('sqlite3').verbose(); let db = new sqlite3.Database('database.sqlite3'); let entity_1_name = '' db.serialize(function(){ db.get('select * from table1 where id = 1', function(er

我使用这个pakcage:
sqlite3
来操作数据库查询,代码如下:

单个查询非常简单:

 var sqlite3 = require('sqlite3').verbose();
 let db = new sqlite3.Database('database.sqlite3');
 let entity_1_name = ''
 db.serialize(function(){
   db.get('select * from table1 where id = 1', function(error, row){
      entity_1_name = row.name
   })
 })
 db.close()
但是如何按顺序执行多个查询呢? (例如,我想先运行query1,再运行query2,再运行query3)
就像:

 var sqlite3 = require('sqlite3').verbose();
 let db = new sqlite3.Database('database.sqlite3');
 let entity_1_name = ''
 let entity_2_name = ''
 db.serialize(function(){

   // this is query1
   db.get('select * from table1 where id = 1', [], function(error, row){
      entity_1_name = row.name
   })

   // this is query2
   db.get('select * from table2 where dependency_column_name = ' + entity_1_name, function(error,row){
      // this sql returns null value, because when this query was executed, the variable "entity_1_name" was not determined by query1.
   })

 })


 db.close()

我可以帮你吗

他们的解决方案是将每个查询放在一个函数中,然后简单地调用它们。 (这是直接取自答案的代码,不是我的。)

然后调用函数

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
   });
});
我可以帮你吗

他们的解决方案是将每个查询放在一个函数中,然后简单地调用它们。 (这是直接取自答案的代码,不是我的。)

然后调用函数

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
   });
});

好的,最后,我使用了
promise
+
async
+
wait
来完成它

第一步。定义函数return
newpromise()

第二步。定义一个
async
函数,调用步骤1中定义的方法


      async do_query_2(){
        let that = this
        // other lines was omitted.
        // HERE , use await to get the result from STEP1. 
        let entity_1_name = await that.get_material_id(row.material_name)

        db.serialize(function(){
          let sql = `'select * from table2 where dependency_column_name = ' + entity_1_name`

          db.run(sql)
        })
        db.close();
      },
第三步。以正常方式调用
do\u query\u 2()

do_query_2()

就这样

好的,最后,我使用了
promise
+
async
+
wait
来完成它

第一步。定义函数return
newpromise()

第二步。定义一个
async
函数,调用步骤1中定义的方法


      async do_query_2(){
        let that = this
        // other lines was omitted.
        // HERE , use await to get the result from STEP1. 
        let entity_1_name = await that.get_material_id(row.material_name)

        db.serialize(function(){
          let sql = `'select * from table2 where dependency_column_name = ' + entity_1_name`

          db.run(sql)
        })
        db.close();
      },
第三步。以正常方式调用
do\u query\u 2()

do_query_2()

就这样

经过一段时间的实验,我只有把第二个查询放在第一个查询的回调中,才能让它工作。是的,很容易进入回调地狱…看起来很容易。我很惊讶,他们没有任何查询方法返回DB对象以外的其他东西。我可能会考虑在这个包周围编写一个异步/等待包装器,因为我自己也需要这个功能。是的,如果你有异步/等待工作,请让我知道~谢谢。@Siwei将它包装在TS中,imo在经过一段时间的实验后更容易使用,只有当我把第二个查询放在第一个查询的回调中,我才能让它工作。是的,很容易进入回调地狱…看起来很容易。我很惊讶,他们没有任何查询方法返回DB对象以外的其他东西。我可能会考虑在这个包周围编写一个异步/等待包装器,因为我自己想要这个功能。是的,如果你有异步/等待工作,请让我知道~谢谢。@Siwei将它包装在TS中,imo更容易使用。谢谢,你的解决方案是最后的选择。可以走,但很容易陷入“电话地狱”。谢谢,你的解决方案是最后的选择。可以去,但很容易陷入“回电话地狱”。