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 相关文章推荐
JavaScript全排列的六种算法 具体实现
Jun 29 Javascript
使用jquery.validate自定义方法实现"手机号码或者固话至少填写一个"的逻辑验证
Sep 01 Javascript
Vue数据驱动模拟实现1
Jan 11 Javascript
基于JavaScript实现自定义滚动条
Jan 25 Javascript
Bootstrap3 多个模态对话框无法显示的解决方案
Feb 23 Javascript
Bootstrap导航中表单简单实现代码
Mar 06 Javascript
axios进阶实践之利用最优雅的方式写ajax请求
Dec 20 Javascript
vue scroller返回页面记住滚动位置的实例代码
Jan 29 Javascript
使用use注册Vue全局组件和全局指令的方法
Mar 08 Javascript
Vue 组件参数校验与非props特性的方法
Feb 12 Javascript
你不可不知的Vue.js列表渲染详解
Oct 01 Javascript
Js参数RSA加密传输之jsencrypt.js的使用
Feb 07 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网页游戏学习之Xnova(ogame)源码解读(三)
2014/06/23 PHP
Yii基于数组和对象的Model查询技巧实例详解
2015/12/28 PHP
php获取ajax的headers方法与内容实例
2017/12/27 PHP
gearman中worker常驻后台,导致MySQL server has gone away的解决方法
2020/02/27 PHP
不用写JS也能使用EXTJS视频演示
2008/12/29 Javascript
jquery遍历input取得input的name
2009/04/27 Javascript
{}与function(){}选用空对象{}来存放keyValue
2012/05/23 Javascript
JavaScript高级程序设计(第3版)学习笔记 概述
2012/10/11 Javascript
如何判断鼠标是否在DIV的区域内
2013/11/13 Javascript
jQuery简单几行代码实现tab切换
2015/03/10 Javascript
jquery使用animate方法实现控制元素移动
2015/03/27 Javascript
jquery中toggle函数交替使用问题
2015/06/22 Javascript
JavaScript中Date对象的常用方法示例
2015/10/24 Javascript
详解AngularJS过滤器的使用
2016/03/11 Javascript
React Native仿美团下拉菜单的实例代码
2017/08/08 Javascript
微信小程序之前台循环数据绑定
2017/08/18 Javascript
VUEJS 2.0 子组件访问/调用父组件的实例
2018/02/10 Javascript
python学习 流程控制语句详解
2016/06/01 Python
Python 3.x读写csv文件中数字的方法示例
2017/08/29 Python
Centos7 Python3下安装scrapy的详细步骤
2018/03/15 Python
python得到电脑的开机时间方法
2018/10/15 Python
Python使用while循环花式打印乘法表
2019/01/28 Python
django数据关系一对多、多对多模型、自关联的建立
2019/07/24 Python
python通过链接抓取网站详解
2019/11/20 Python
如何使用Python发送HTML格式的邮件
2020/02/11 Python
python shell命令行中import多层目录下的模块操作
2020/03/09 Python
Python 实现使用空值进行赋值 None
2020/03/12 Python
基于python实现监听Rabbitmq系统日志代码示例
2020/11/28 Python
python利用后缀表达式实现计算器功能
2021/02/22 Python
html5调用app分享功能示例(WebViewJavascriptBridge)
2018/03/21 HTML / CSS
美国电力供应商店/电气批发商:USESI
2018/10/12 全球购物
如何写一个自定义标签
2012/12/28 面试题
市场营销职业生涯规划书范文
2014/01/12 职场文书
党员评议表自我评价范文
2014/10/20 职场文书
公务员保密工作承诺书
2015/05/04 职场文书
戒赌保证书
2015/05/11 职场文书