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 相关文章推荐
精心挑选的15个jQuery下拉菜单制作教程
Jun 15 Javascript
css transform 3D幻灯片特效实现步骤解读
Mar 27 Javascript
jquery实现图片按比例缩放示例
Jul 01 Javascript
实例分析javascript中的call()和apply()方法
Nov 28 Javascript
js实现iframe跨页面调用函数的方法
Dec 13 Javascript
JavaScript实现防止网页被嵌入Frame框架的代码分享
Dec 29 Javascript
javascript计时器详解
Feb 28 Javascript
jquery实现可横向和竖向展开的动态下滑菜单效果
Aug 24 Javascript
关于input全选反选恶心的异常情况
Jul 24 Javascript
Javascript使用SWFUpload进行多文件上传
Nov 16 Javascript
js获取json中key所对应的value值的简单方法
Jun 17 Javascript
Thinkjs3新手入门之如何使用静态资源目录
Dec 06 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使用Jpgraph绘制3D饼状图的方法
2015/06/10 PHP
PHP中__autoload和Smarty冲突的简单解决方法
2016/04/08 PHP
PHP双向链表定义与用法示例
2018/01/31 PHP
定义select的边框颜色
2008/04/28 Javascript
javascript 读取xml,写入xml 实现代码
2009/07/10 Javascript
使用js检测浏览器的实现代码
2013/05/14 Javascript
javascript中的toFixed固定小数位数 简单实例分享
2013/07/12 Javascript
zTree插件之单选下拉菜单实例代码
2013/11/07 Javascript
详解JavaScript的另类写法
2016/04/11 Javascript
js中遍历Map对象的简单实例
2016/08/08 Javascript
JavaScript 中对象的深拷贝
2016/12/04 Javascript
js实现的在线调色板功能完整实例
2016/12/21 Javascript
AngularJS中update两次出现$promise属性无法识别的解决方法
2017/01/05 Javascript
Angular5中调用第三方库及jQuery的添加的方法
2018/06/07 jQuery
从零开始学习搭建React脚手架项目
2018/08/23 Javascript
vue项目打包部署_nginx代理访问方法详解
2018/09/20 Javascript
优化Vue项目编译文件大小的方法步骤
2019/05/27 Javascript
Vue.js组件通信之自定义事件详解
2019/10/19 Javascript
使用python将mdb数据库文件导入postgresql数据库示例
2014/02/17 Python
Python实现类似jQuery使用中的链式调用的示例
2016/06/16 Python
详解Python nose单元测试框架的安装与使用
2017/12/20 Python
python flask框架实现传数据到js的方法分析
2019/06/11 Python
Python Process多进程实现过程
2019/10/22 Python
python+Django实现防止SQL注入的办法
2019/10/31 Python
matplotlib绘制多个子图(subplot)的方法
2019/12/03 Python
python实现udp传输图片功能
2020/03/20 Python
Selenium自动化测试工具使用方法汇总
2020/06/12 Python
python 获取剪切板内容的两种方法
2020/11/28 Python
纪伊国屋泰国网上书店:Kinokuniya泰国
2017/12/24 全球购物
Habitat家居英国官方网站:沙发、家具、照明、厨房和户外
2019/12/12 全球购物
习近平在党的群众路线教育实践活动总结大会上的讲话
2014/10/21 职场文书
公司市场部岗位职责
2015/04/15 职场文书
2015年宣传部个人工作总结
2015/05/14 职场文书
爱国主义教育基地观后感
2015/06/18 职场文书
大学毕业谢师宴致辞
2015/07/27 职场文书
浅谈redis的过期时间设置和过期删除机制
2022/03/18 MySQL