在sqlite3(节点包)中,如何按顺序运行多个查询? [英] in sqlite3 (node package), how to run multiple queries by sequence?
本文介绍了在sqlite3(节点包)中,如何按顺序运行多个查询?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在使用这个包:sqlite3
来操作数据库查询,代码如下:
单个查询很简单:
var sqlite3 = require('sqlite3').verbose();让 db = new sqlite3.Database('database.sqlite3');让 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();让 db = new sqlite3.Database('database.sqlite3');让 entity_1_name = ''让 entity_2_name = ''db.serialize(function(){//这是查询 1db.get('select * from table1 where id = 1', [], function(error, row){entity_1_name = row.name})//这是查询 2db.get('select * from table2 where dependency_column_name = ' + entity_1_name, function(error,row){//这个 sql 返回空值,因为当这个查询被执行时,变量entity_1_name"被不是由 query1 确定的.})})db.close()
解决方案
OK,最后我用了 promise
+ async
+ await
完成它.
第一步.定义一个函数 return new Promise()
do_query_1(material_name){//1. 返回这个新的 Promise()返回新的承诺((解决,拒绝)=> {让 db = this.$database_tool.get_db()让那个=这个db.serialize(function(){db.get(`select * from table1 where id = 1`, [], function(error, row){//2. 这就是重点,把任何你想要的结果都放到 resolve() 中解决(row.id)})})db.close();})},
步骤 2.定义一个async
函数,调用Step1中定义的方法.
步骤 3.以正常方式调用do_query_2()
:
do_query_2()
就是这样!
I am using this pakcage: sqlite3
to manipulate database queries, code like this:
single query is quit simple:
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()
But how to execute multiple queries and in sequence?
(e.g. I want to run query1, then query2, then query3 )
just like:
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()
解决方案
OK, at last, I used promise
+ async
+ await
to make it done.
Step1. define a function return new Promise()
do_query_1(material_name){
// 1. return this new Promise()
return new Promise( (resolve, reject) => {
let db = this.$database_tool.get_db()
let that = this
db.serialize(function(){
db.get(`select * from table1 where id = 1`, [], function(error, row){
// 2. this is the point, put anything you want to result to resolve()
resolve(row.id)
})
})
db.close();
})
},
Step2. define a async
function, to call the method defined in Step1.
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();
},
Step3. call do_query_2()
in normal way:
do_query_2()
That's it!
这篇关于在sqlite3(节点包)中,如何按顺序运行多个查询?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文