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 相关文章推荐
Jquery在指定DIV加载HTML示例代码
Feb 17 Javascript
jQuery消息提示框插件Tipso
May 04 Javascript
javascript相关事件的几个概念
May 21 Javascript
基于Bootstrap的后台管理面板 Bootstrap Metro Dashboard
Jun 17 Javascript
Bootstrap弹出带合法性检查的登录框实例代码【推荐】
Jun 23 Javascript
angularjs实现文字上下无缝滚动特效代码
Sep 04 Javascript
JavaScript函数基础详解
Feb 03 Javascript
bootstrap table 数据表格行内修改的实现代码
Feb 13 Javascript
Vue中保存用户登录状态实例代码
Jun 07 Javascript
详解vuex 渐进式教程实例代码
Nov 27 Javascript
vue实现树形结构样式和功能的实例代码
Oct 15 Javascript
JS表单验证插件之数据与逻辑分离操作实例分析【策略模式】
May 01 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的朋友 经常问的一些问题。不断更新
2011/08/11 PHP
php下载文件的代码示例
2012/06/29 PHP
asp函数split()对应php函数explode()
2019/02/27 PHP
[原创]后缀就扩展名为js的文件是什么文件
2007/12/06 Javascript
JQuery 学习技巧总结
2010/05/21 Javascript
原生javascript实现图片轮播效果代码
2010/09/03 Javascript
E3 tree 1.6在Firefox下显示问题的修复方法
2013/01/30 Javascript
删除Javascript Object中间的key
2014/11/18 Javascript
JavaScript中的console.profile()函数详细介绍
2014/12/29 Javascript
jQuery解决$符号命名冲突
2016/06/18 Javascript
AngularJs入门教程之环境搭建+创建应用示例
2016/11/01 Javascript
JS求解三元一次方程组值的方法
2017/01/03 Javascript
从零开始学习Node.js系列教程六:EventEmitter发送和接收事件的方法示例
2017/04/13 Javascript
pace.js和NProgress.js两个加载进度插件的一点小总结
2018/01/31 Javascript
使用JS模拟锚点跳转的实例
2018/02/01 Javascript
解决vue-cli 打包后自定义动画未执行的问题
2019/11/12 Javascript
Python获取任意xml节点值的方法
2015/05/05 Python
Python备份目录及目录下的全部内容的实现方法
2016/06/12 Python
利用python批量检查网站的可用性
2016/09/09 Python
python 数据清洗之数据合并、转换、过滤、排序
2017/02/12 Python
详谈Python基础之内置函数和递归
2017/06/21 Python
pytorch 把MNIST数据集转换成图片和txt的方法
2018/05/20 Python
Python学习笔记基本数据结构之序列类型list tuple range用法分析
2019/06/08 Python
浅谈Pandas Series 和 Numpy array中的相同点
2019/06/28 Python
Numpy 理解ndarray对象的示例代码
2020/04/03 Python
pycharm 关掉syntax检查操作
2020/06/09 Python
PyCharm设置注释字体颜色以及是否倾斜的操作
2020/09/16 Python
史上最详细的Python打包成exe文件教程
2021/01/17 Python
浅谈html5之sse服务器发送事件EventSource介绍
2017/08/28 HTML / CSS
硕士研究生自我鉴定范文
2013/12/27 职场文书
运动会班级口号
2014/06/09 职场文书
运动会新闻报道稿
2015/07/22 职场文书
安全教育主题班会总结
2015/08/14 职场文书
2016春节放假通知范文
2015/08/18 职场文书
使用golang编写一个并发工作队列
2021/05/08 Golang
javascript的var与let,const之间的区别详解
2022/02/18 Javascript