Node.js如何对SQLite的async/await封装详解


Posted in Javascript onFebruary 14, 2019

前言

本文主要给大家介绍的是关于Node.js对SQLite的async/await封装的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧

用于将每个SQLite函数同步化,并可以用await的接口。

注意:需要SQLite for Node模块和Node.js 8.0+,并支持async / await。

SQLite最常用作本地或移动应用程序的存储单元,当需要从程序的各个部分访问数据时,回调不是最佳解决方案。

为了在程序程序中更自然地访问数据,我编写了一个将回调转换为promises的接口,因此我们可以将每个函数与await关键字一起使用。 它不是异步函数的替代品,它是一个补充,可以将原始函数和同步函数一起使用。

aa-sqlite模块

SQLite的接口是一个名为aa-sqlite的模块,您必须将其存储在应用程序的node_modules部分中。这是完整的源代码

const sqlite3 = require('sqlite3').verbose()
var db
 
exports.db = db
 
exports.open=function(path) {
 return new Promise(function(resolve) {
 this.db = new sqlite3.Database(path,
  function(err) {
   if(err) reject("Open error: "+ err.message)
   else resolve(path + " opened")
  }
 ) 
 })
}
 
// any query: insert/delete/update
exports.run=function(query) {
 return new Promise(function(resolve, reject) {
  this.db.run(query,
   function(err) {
    if(err) reject(err.message)
    else resolve(true)
  })
 }) 
}
 
// first row read
exports.get=function(query, params) {
 return new Promise(function(resolve, reject) {
  this.db.get(query, params, function(err, row) {
   if(err) reject("Read error: " + err.message)
   else {
    resolve(row)
   }
  })
 })
}
 
// set of rows read
exports.all=function(query, params) {
 return new Promise(function(resolve, reject) {
  if(params == undefined) params=[]
 
  this.db.all(query, params, function(err, rows) {
   if(err) reject("Read error: " + err.message)
   else {
    resolve(rows)
   }
  })
 })
}
 
// each row returned one by one
exports.each=function(query, params, action) {
 return new Promise(function(resolve, reject) {
  var db = this.db
  db.serialize(function() {
   db.each(query, params, function(err, row) {
    if(err) reject("Read error: " + err.message)
    else {
     if(row) {
      action(row)
     } 
    }
   })
   db.get("", function(err, row) {
    resolve(true)
   })   
  })
 })
}
 
exports.close=function() {
 return new Promise(function(resolve, reject) {
  this.db.close()
  resolve(true)
 })
}

使用示例

下面的示例展示了aa-sqlite的每个功能的示例。在第一部分中,我们打开一个数据库,添加一个表并用一些行填充该表。然后关闭数据库,我们再次打开它并执行一些同步查询。

const fs = require("fs")
const sqlite = require("aa-sqlite")
 
async function mainApp() {
  
 console.log(await sqlite.open('./users.db'))
  
 // Adds a table
  
 var r = await sqlite.run('CREATE TABLE users(ID integer NOT NULL PRIMARY KEY, name text, city text)')
 if(r) console.log("Table created")
 
 // Fills the table
  
 let users = {
  "Naomi": "chicago",
  "Julia": "Frisco",
  "Amy": "New York",
  "Scarlett": "Austin",
  "Amy": "Seattle"
 }
  
 var id = 1
 for(var x in users) {
  var entry = `'${id}','${x}','${users[x]}'`
  var sql = "INSERT INTO users(ID, name, city) VALUES (" + entry + ")"
  r = await sqlite.run(sql)
  if(r) console.log("Inserted.")
  id++  
 }
 
 // Starting a new cycle to access the data
 
 await sqlite.close();
 await sqlite.open('./users.db')
 
 console.log("Select one user:")
  
 var sql = "SELECT ID, name, city FROM users WHERE name='Naomi'"
 r = await sqlite.get(sql)
 console.log("Read:", r.ID, r.name, r.city)
  
 console.log("Get all users:")
  
 sql = "SELECT * FROM users"
 r = await sqlite.all(sql, [])
 r.forEach(function(row) {
  console.log("Read:", row.ID, row.name, row.city) 
 })
  
 console.log("Get some users:")
  
 sql = "SELECT * FROM users WHERE name=?"
 r = await sqlite.all(sql, ['Amy'])
 r.forEach(function(row) {
  console.log("Read:", row.ID, row.name, row.city) 
 })
 
 console.log("One by one:")
  
 sql = "SELECT * FROM users"
 r = await sqlite.each(sql, [], function(row) {
  console.log("Read:", row.ID, row.name, row.city) 
 })
 
 if(r) console.log("Done.")
 
 sqlite.close();
}
 
try {
 fs.unlinkSync("./users.db")
}
catch(e) {
}
 
mainApp()

由于all方法返回一个row数组,我们使用forEach来处理每一行的内容。

你可以在每个方法的情况下进行验证,即在程序显示“完成”之前处理返回的每一行。原始异步方法不会出现这种情况。

参考并翻译自:https://www.scriptol.com/sql/sqlite-async-await.php

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
jscript之Open an Excel Spreadsheet
Jun 13 Javascript
BOM与DOM的区别分析
Oct 26 Javascript
扩展jquery实现客户端表格的分页、排序功能代码
Mar 16 Javascript
js获取指定日期前后的日期代码
Aug 20 Javascript
js动态添加事件并可传参数示例代码
Oct 21 Javascript
tangram框架响应式加载图片方法
Nov 21 Javascript
javascript结合fileReader 实现上传图片
Jan 30 Javascript
Angularjs手动解析表达式($parse)
Oct 12 Javascript
jQuery中clone()函数实现表单中增加和减少输入项
May 13 jQuery
easyUI下拉列表点击事件使用方法
May 18 Javascript
vue.js实例对象+组件树的详细介绍
Oct 20 Javascript
Ant Design moment对象和字符串之间的相互转化教程
Oct 27 Javascript
VuePress 静态网站生成方法步骤
Feb 14 #Javascript
extract-text-webpack-plugin用法详解
Feb 14 #Javascript
JavaScript"模拟事件"的注意要点详解
Feb 13 #Javascript
快速了解Node中的Stream流是什么
Feb 13 #Javascript
vue2.0+vue-router构建一个简单的列表页的示例代码
Feb 13 #Javascript
vue实现点击隐藏与显示实例分享
Feb 13 #Javascript
JS+canvas画布实现炫酷的旋转星空效果示例
Feb 13 #Javascript
You might like
解析CI即CodeIgniter框架在Nginx下的重写规则
2013/06/03 PHP
深入PHP数据加密详解
2013/06/18 PHP
PHP文件后缀不强制为.php方法
2019/03/31 PHP
js下关于onmouseout、事件冒泡的问题经验小结
2010/12/09 Javascript
判定是否原生方法的JS代码
2013/11/12 Javascript
JQuery打造省市下拉框联动效果
2014/05/18 Javascript
js获取当前时间显示在页面上并每秒刷新
2014/12/24 Javascript
JavaScript中的console.trace()函数介绍
2014/12/29 Javascript
jQuery学习笔记之jQuery+CSS3的浏览器兼容性
2015/01/19 Javascript
JS鼠标拖拽实例分析
2015/11/23 Javascript
实现高性能JavaScript之执行与加载
2016/01/30 Javascript
jquery 判断selection range 是否在容器中的简单实例
2016/08/02 Javascript
引用jquery框架后出错的解决方法
2016/08/09 Javascript
Vue.js路由vue-router使用方法详解
2017/03/20 Javascript
jQuery插件FusionCharts绘制的2D帕累托图效果示例【附demo源码】
2017/03/28 jQuery
解决html input验证只能输入数字,不能输入其他的问题
2017/07/21 Javascript
vue组件的写法汇总
2018/04/12 Javascript
实例讲解JavaScript预编译流程
2019/01/24 Javascript
python使用正则表达式替换匹配成功的组并输出替换的次数
2017/11/22 Python
python实现BP神经网络回归预测模型
2019/08/09 Python
python list等分并从等分的子集中随机选取一个数
2020/11/16 Python
澳大利亚儿童精品仓库:Goo & Co.
2019/06/20 全球购物
一个SQL面试题
2014/08/21 面试题
Java中各种基本数据类型的默认值都是什么
2016/12/22 面试题
实习教师自我鉴定
2013/12/09 职场文书
打架检讨书800字
2014/01/10 职场文书
校庆接待方案
2014/03/18 职场文书
情人节寄语大全
2014/04/11 职场文书
2014年纳税评估工作总结
2014/12/23 职场文书
驳回起诉裁定书
2015/05/19 职场文书
班主任开场白
2015/06/01 职场文书
初一语文教学反思
2016/03/03 职场文书
2016年春季趣味运动会开幕词
2016/03/04 职场文书
感谢信
2019/04/11 职场文书
教你用Java Swing实现自助取款机系统
2021/06/11 Java/Android
Java后台生成图片的完整步骤
2021/08/04 Java/Android