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 相关文章推荐
一直复略了的一个问题,关于表单重复提交
Feb 15 Javascript
jQuery学习5 jQuery事件模型
Feb 07 Javascript
jquery 模拟雅虎首页的点击对话框效果
Apr 11 Javascript
详解AngularJS中module模块的导入导出
Dec 10 Javascript
JavaScript中获取时间的函数集
Aug 16 Javascript
总结Javascript中数组各种去重的方法
Oct 04 Javascript
探索Vue.js component内容实现
Nov 03 Javascript
基于Bootstrap的网页设计实例
Mar 01 Javascript
webpack-dev-server远程访问配置方法
Feb 22 Javascript
小程序实现短信登录倒计时
Jul 12 Javascript
vue.js click点击事件获取当前元素对象的操作
Aug 07 Javascript
解决idea开发遇到javascript动态添加html元素时中文乱码的问题
Sep 29 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
WML,Apache,和 PHP 的介绍
2006/10/09 PHP
php用户注册页面利用js进行表单验证具体实例
2013/10/17 PHP
php 实现简单的登录功能示例【基于thinkPHP框架】
2019/12/02 PHP
php实现JWT验证的实例教程
2020/11/26 PHP
学习YUI.Ext 第七天--关于View&JSONView
2007/03/10 Javascript
js兼容标准的表格变色效果
2008/06/28 Javascript
Javascript 篱式条件判断
2008/08/22 Javascript
实现JavaScript中继承的三种方式
2009/10/16 Javascript
基于jquery打造的百分比动态色彩条插件
2012/09/19 Javascript
Android中资源文件(非代码部分)的使用概览
2012/12/18 Javascript
JS实现div内部的文字或图片自动循环滚动代码
2013/04/19 Javascript
javascript一元操作符(递增、递减)使用示例
2013/08/07 Javascript
JS将制定内容复制到剪切板示例代码
2014/02/11 Javascript
详解Angular中$cacheFactory缓存的使用
2016/08/19 Javascript
微信小程序 实例开发总结
2017/04/26 Javascript
Nodejs中Express 常用中间件 body-parser 实现解析
2017/05/22 NodeJs
vue使用Element组件时v-for循环里的表单项验证方法
2018/06/28 Javascript
CSS3 动画卡顿性能优化的完美解决方案
2018/09/20 Javascript
vue 组件简介
2020/07/31 Javascript
python列表的常用操作方法小结
2016/05/21 Python
Python实现删除文件中含“指定内容”的行示例
2017/06/09 Python
用python做一个搜索引擎(Pylucene)的实例代码
2017/07/05 Python
通过cmd进入python的实例操作
2019/06/26 Python
python sklearn库实现简单逻辑回归的实例代码
2019/07/01 Python
python监控进程状态,记录重启时间及进程号的实例
2019/07/15 Python
学习和使用python的13个理由
2019/07/30 Python
20行Python代码实现视频字符化功能
2020/04/13 Python
Pytorch通过保存为ONNX模型转TensorRT5的实现
2020/05/25 Python
基于Python的一个自动录入表格的小程序
2020/08/05 Python
NET程序员上机面试题
2015/05/23 面试题
C#笔试题和英文面试题
2013/02/07 面试题
Linux如何命名文件--使用文件名时应注意
2014/05/29 面试题
教师群众路线心得体会
2014/11/04 职场文书
家长通知书家长意见
2014/12/30 职场文书
2015年专项整治工作总结
2015/04/03 职场文书
张丽莉观后感
2015/06/16 职场文书