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 相关文章推荐
Prototype Class对象学习
Jul 19 Javascript
js实现的日期操作类DateTime函数代码
Mar 16 Javascript
网页前台通过js非法字符过滤代码(骂人的话等等)
May 26 Javascript
JavaScript 模拟类机制及私有变量的方法及思路
Jul 10 Javascript
js控制容器隐藏出现防止样式变化的两种方法
Apr 25 Javascript
Jsonp post 跨域方案
Jul 06 Javascript
js去字符串前后空格的实现方法
Feb 26 Javascript
javascript拖拽效果延伸学习
Apr 04 Javascript
javascript实现将数字转成千分位的方法小结【5种方式】
Dec 11 Javascript
jquery uploadify如何取消已上传成功文件
Feb 08 Javascript
vue开发调试神器vue-devtools使用详解
Jul 13 Javascript
JavaScript 判断浏览器是否是IE
Feb 19 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
php GD绘制24小时柱状图
2008/06/28 PHP
兼容性最强的PHP生成缩略图的函数代码(修改版)
2011/01/18 PHP
PHP操作mysql函数详解,mysql和php交互函数
2011/05/19 PHP
php IP转换整形(ip2long)的详解
2013/06/06 PHP
php的sprintf函数的用法 控制浮点数格式
2014/02/14 PHP
Joomla数据库操作之JFactory::getDBO用法
2016/05/05 PHP
Gambit vs ForZe BO3 第一场 2.13
2021/03/10 DOTA
IE6、IE7中获取Button元素的值的bug说明
2011/08/28 Javascript
jquery ajax 局部无刷新更新数据的实现案例
2014/02/08 Javascript
jquery控制select的text/value值为选中状态
2014/06/03 Javascript
第五章之BootStrap 栅格系统
2016/04/25 Javascript
JavaScript判断数组是否存在key的简单实例
2016/08/03 Javascript
ES6新特性之变量和字符串用法示例
2017/04/01 Javascript
[01:28:24]NAVI vs VG Supermajor 败者组 BO3 第三场 6.5
2018/06/06 DOTA
Python计算字符宽度的方法
2016/06/14 Python
基于python 二维数组及画图的实例详解
2018/04/03 Python
python如何将多个PDF进行合并
2019/08/13 Python
Python操作注册表详细步骤介绍
2020/02/05 Python
如何将tensorflow训练好的模型移植到Android (MNIST手写数字识别)
2020/04/22 Python
在matplotlib中改变figure的布局和大小实例
2020/04/23 Python
500行python代码实现飞机大战
2020/04/24 Python
Scrapy 配置动态代理IP的实现
2020/09/28 Python
HTML5对手机页面长按会粘贴复制禁用的解决方法
2016/07/19 HTML / CSS
全球速卖通:AliExpress(国际版淘宝)
2017/09/20 全球购物
澳大利亚最好的厨具店:Kitchen Warehouse
2018/03/13 全球购物
在C语言中"指针和数组等价"到底是什么意思?
2014/03/24 面试题
遇到的Mysql的面试题
2014/06/29 面试题
经营理念标语
2014/06/21 职场文书
2014年房地产工作总结范文
2014/11/19 职场文书
经费申请报告
2015/05/15 职场文书
医者仁心观后感
2015/06/17 职场文书
谢师宴学生致辞
2015/07/27 职场文书
pandas 操作 Excel操作总结
2021/03/31 Python
总结Python变量的相关知识
2021/06/28 Python
JavaScript事件的委托(代理)的用法示例详解
2022/02/18 Javascript
漫画「日和酱的要求是绝对的」第3卷封面公开
2022/03/21 日漫