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 相关文章推荐
又一个图片自动缩小的JS代码
Mar 10 Javascript
JS实多级联动下拉菜单类,简单实现省市区联动菜单!
May 03 Javascript
JavaScript 在各个浏览器中执行的耐性
Apr 06 Javascript
javascript 基础篇4 window对象,DOM
Mar 14 Javascript
基于JS实现导航条flash导航条
Jun 17 Javascript
js中的DOM模拟购物车功能
Mar 22 Javascript
小程序兼容安卓和IOS数据处理问题及坑
Sep 18 Javascript
实例讲解JavaScript截取字符串
Nov 30 Javascript
JS中比较两个Object数组是否相等方法实例
Nov 11 Javascript
Vue 实现简易多行滚动"弹幕"效果
Jan 02 Javascript
微信浏览器左上角返回按钮监听的实现
Mar 04 Javascript
在Vue中使用HOC模式的实现
Aug 23 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
一个用于网络的工具函数库
2006/10/09 PHP
PHP sprintf()函数用例解析
2011/05/18 PHP
phpcms模块开发之swfupload的使用介绍
2013/04/28 PHP
smarty高级特性之对象的使用方法
2015/12/25 PHP
PHP面向对象程序设计之接口的继承定义与用法详解
2018/12/20 PHP
jQuery contains过滤器实现精确匹配使用方法
2013/04/12 Javascript
jQuery根据纬度经度查看地图处理程序
2013/05/08 Javascript
js登录弹出层特效
2014/03/07 Javascript
JS实现根据当前文字选择返回被选中的文字
2014/05/21 Javascript
jQuery实现点击图片翻页展示效果的方法
2015/02/16 Javascript
JavaScript原生对象之Date对象的属性和方法详解
2015/03/13 Javascript
javascript比较两个日期相差天数的方法
2015/07/24 Javascript
JQuery实现级联下拉框效果实例讲解
2015/09/17 Javascript
JS中JSON对象和String之间的互转及处理技巧
2016/04/06 Javascript
js实现动态创建的元素绑定事件
2016/07/19 Javascript
快速将Vue项目升级到webpack3的方法步骤
2017/09/14 Javascript
angular1.x ui-route传参的三种写法小结
2018/08/31 Javascript
利用Bootstrap Multiselect实现下拉框多选功能
2019/04/08 Javascript
微信小程序单选框自定义赋值
2020/05/26 Javascript
[00:32]2018DOTA2亚洲邀请赛VG出场
2018/04/03 DOTA
python判断端口是否打开的实现代码
2013/02/10 Python
MySQL中表的复制以及大型数据表的备份教程
2015/11/25 Python
python处理按钮消息的实例详解
2017/07/11 Python
利用python画出折线图
2018/07/26 Python
解决pandas.DataFrame.fillna 填充Nan失败的问题
2018/11/06 Python
Python包和模块的分发详细介绍
2020/06/19 Python
Python爬虫定时计划任务的几种常见方法(推荐)
2021/01/15 Python
澳大利亚在线床零售商:Bedworks
2020/09/01 全球购物
Java语言程序设计测试题选择题部分
2014/04/03 面试题
会计自荐书
2013/12/02 职场文书
大学生职业生涯规划方案
2014/01/03 职场文书
蛋糕店创业计划书
2014/05/06 职场文书
运动会入场口号
2014/06/07 职场文书
4s店销售经理岗位职责
2014/07/19 职场文书
请客吃饭开场白
2015/06/01 职场文书
女方家长婚礼答谢词
2015/09/29 职场文书