位置: 编程技术 - 正文

nodejs集成sqlite使用示例

编辑:rootadmin

推荐整理分享nodejs集成sqlite使用示例,希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:,内容如对您有帮助,希望把文章链接给更多的朋友!

正在物色node上面的轻量级嵌入式数据库,作为嵌入式数据库的代表,sqlite无疑是个理想的选择方案。npm上集成sqlite的库主要有两个——sqlite3和realm。

realm是一个理想的选择方案,它最初是为移动app设计的,在node也可以运行的,但是不支持Windows系统。sqlite3是一个专为nodejs设计的,在nodejs上面生态更健壮,因此最终选择sqlite3。

sqlite3几乎支持所有版本的nodejs,同时也可以和nwjs集成。

安装

基于npm安装

这样除了安装完sqlite3的npm包,最主要的是也装完了sqlite数据库,因为sqlite是嵌入式数据库,嵌入到客户端中。sqlite3使用node-pre-gyp为各个平台下载指定的预编译的二进制文件。如果无法下载到预编译的二进制文件,sqlite3将使用node-gyp和源代码来构建扩展。

这个过程出现两个的库——node-pre-gyp和node-gyp。他们究竟是什么呢?

node-gyp是一个跨平台的命令行工具,用于编译C++编写的nodejs扩展,首先gyp是为Chromium项目创建的项目生成工具,可以从平台无关的配置生成平台相关的Visual Studio、Xcode、Makefile的项目文件,node-gyp就是将其集成到nodejs中。因为linux的二进制分发快平台做的并不好,所有npm为了方便干脆就直接源码分发,用户装的时候再现场编译。不过对有些项目二进制分发就比源码分发简单多了,所以还有个node-pre-gyp来直接二进制扩展的分发。

两者区别在于node-gyp是发布扩展的源码,然后安装时候编译;node-pre-gyp是直接发布编译后的二级制形式的扩展。

和sqlite3一样的需要基于node-gyp安装的npm模块也有很多,比如node-sass等,都是发布源代码,然后编译安装。

基础api

sqlite3的api都是基于函数回调的,因为nodejs中没有像java的jdbc那种官方的数据库客户端接口,因此每个数据库的api都不一样,这里简单介绍几个sqlite3重要的api。

新建并打开数据库

该方法返回一个自动打开的数据库对象,参数:

filename:有效值是一个文件名,如:“mydatebase.db”,数据库打开之后会创建一个“mydatebase.db”的文件用于保存数据。如果文件名是“:memory:”,表示是一个内存数据库(类似h2那种),数据不会持久化保存,当关闭数据库时,内容将丢失。

mode(可选):数据库的模式,共3种值:sqlite3.OPEN_READONLY(只读),sqlite3.OPEN_READWRITE(可读写)和sqlite3.OPEN_CREATE(可以创建)。 默认值为OPEN_READWRITE |OPEN_CREATE。

callback(可选):则当数据库成功打开或发生错误时,将调用此函数。 第一个参数是一个错误对象,当它为空时,表示打开成功。

打开一个数据库,如:

执行后会在项目的根目录生成一个“mydatebase.db”文件,这就是sqlite保存数据的文件了。

关闭数据库

该方法可以关闭一个数据库连接对象,参数:

callback(可选):关闭成功的回调。 第一个参数是一个错误对象,当它为“null”时,表示关闭成功。

执行DDL和DML语句

该方法可以执行DDL和DML语句,如建表、删除表、删除行数据、插入行数据等,参数:

sql:要运行的SQL字符串。sql的类型是DDL和DML,DQL不能使用这个命令。执行后返回值不包含任何结果,必须通过callback回调函数获取执行结果。

param,...(可选):当SQL语句包含占位符(&#;)时,这里可以传对应的参数。 这里有三种传值方法,如:

关于占位符的命名,sqlite3还支持更复杂的形式,这里不再扩展,有兴趣了解的话请查看官方文档。

callback(可选):如果执行成功,则第一个参数为null,否则就是出错。

如果执行成功,上下文this包含两个属性:lastID和changes。lastID表示在执行INSERT命令语句时,最后一条数据的id;changes表示UPADTE命令和DELETE命令时候,影响的数据行数。

执行多条语句

Database#exec与Database#run函数一样,都是DDL和DML语句,但是Database#exec可以执行多条语句,并且不支持占位符参数。

查询一条数据

nodejs集成sqlite使用示例

sql:要运行的SQL字符串。sql的类型是DQL。这里仅返回第一条查询到的数据。

param,...(可选):同Database#run的param参数

callback(可选):同样是返回null代表执行成功。回调的签名是function(err,row)。如果查询结果集为空,则第二个参数为undefined;否则第二个参数值是查询到的第一个对象,他是个json对象,属性名称对应于结果集的列名称,因此查询的每一列都应该给出一个列表名。

查询所有数据

sql:要运行的SQL字符串。sql的类型是DQL。和Database#get不同,Database#all会返回所有查询到的语句。

param,...(可选):同Database#run的param参数

callback(可选):同样是返回null代表执行成功。回调的签名是function(err, rows) 。rows是一个数组,如果查询结果集为空数组。

! 注意,Database#all首先检索所有结果行并将其存储在内存中。 对于数据量可能很大的查询命令时候,请使用Database#each函数或Database#prepare代替这个方法。

遍历数据

与Database#run函数相同,都是查询多条数据,但是具有以下区别:

回调的签名是function(err,row)。如果结果集成功但为空,则不会调用回调。对于每个检索到的行,该方法都会调用一次回调。执行顺序与结果集中的行顺序完全对应。

调用所有行回调后,如果存在complete回调函数,将调用这个回调。第一个参数是一个错误对象,第二个参数是检索行数。

语句执行顺序

sqlite3的API都是异步的,这就会出现可能有若干个命令同时进行的情况,因此sqlite3提供了两个函数来帮助控制语句的执行流程。默认是并行模式。

序列化执行

如果提供回调,它将立即被调用,即此方法的回调不是异步回调。在该回调中调度的所有数据库语句将被序列化运行,即一个接一个地执行。 函数返回后,数据库将再次设置为其原始模式。

并行执行模式

如果提供回调,它将立即被调用,即此方法的回调不是异步回调。在该回调中调度的所有数据库语句将并行运行。函数返回后,数据库将再次设置为其原始模式。

预编译SQL相关api

在java的jdbc中,有个PreparedStatement相关的api,可以预编译sql语句,执行的时候再链接具体参数。这样的好处是可以减少sql语句被编译的次数。在sqlite3中,也存在实现这样功能的api。

Database#prepare执行后,会返回一个命令对象,这个命令对象可以反复执行。下面看看这个命令对象(statement )的api:

以上api方法与Database的同名方法调用方式相同。不同点是这里的Statement对象是可以复用的,避免了重复编译sql语句,因此项目中更推荐使用上述方法。

! 注意,这些方法的param参数都会对Statement对象绑定参数,在下一次执行的时候,如果没有重新绑定参数,是会使用上一次参数的。

绑定参数

Database#prepare执行的时候,是可以绑定参数的。不过使用此方法可以全重置语句对象和行游标,并删除所有先前绑定的参数,实现重新绑定的功能。

重置语句的行游标

重置语句的行游标,并保留参数绑定。使用此功能可以使用相同的绑定重新执行相同的查询。

数据库事务

事务是关系型数据库中的一个重要部分,sqlite自然也是支持事务的,但是sqlite3并没有提供特殊API去实现的事务相关的操作,只能靠SQL语句去控制事务。这里举一个事务相关的例子。

对SQLCipher的支持

SQLCipher是一个在SQLite基础之上进行扩展的开源数据库,他和SQLite不同就是提供了对数据的加密,可提供数据库文件的透明位AES加密。

sqlite3的官网特意提及他对SQLCipher的集成,如果要集成sqlcipher需要在编译时候通过构建选项告诉sqlite3要集成的是SQLCipher:

不过笔者并没尝试对SQLCipher的集成,具体集成方法请自行查阅官网对这部分的详细介绍。

基于promise对sqlite3API的封装

sqlite3的API是node早期的API风格,对异步的书写风格并不友好,很容易出现“金字塔回调”式的代码。为了让对API的调用更加优雅,我们往往会把回调封装成Promise。事实上这个工作并不需要我们自己做,sqlite3生态下已经有其他库可以实现这样的功能。sqlite就是一个这样的库。他基于sqlite3,只手用Promise重新封装了一下sqlite3的API,使其代码风格更加优雅,也更容易使用。

标签: nodejs集成sqlite使用示例

本文链接地址:https://www.jiuchutong.com/biancheng/380833.html 转载请保留说明!

上一篇:yarn的使用与升级Node.js的方法详解(yarn功能)

下一篇:Node.js开发第三方微信公众平台(node.js web开发)

  • 税率如何计算公式
  • 销售货物提供运输是否分别核酸的例题
  • 广告赞助支出可以抵税吗
  • 计提城市维护建设费和教育费附加的会计分录
  • 代收的电费计入什么费用
  • 材料采购合同需要注意什么
  • 公司对公账户给员工发工资税是谁扣
  • 2020劳务退税怎么退
  • 固定资产出售损失属于广义费用吗
  • 个人到税务局开增值税专用发票
  • 合并业务的好处
  • 哪些企业税收优惠
  • 土地使用税的免税规定有哪些
  • 外经证提交一般要多久可以通过
  • 国家高新补助款多久到账
  • 营改增施工企业哪些能退
  • 事业单位利息收入
  • 小规模纳税人网上申报流程视频
  • 报税没有申报现金流量表
  • 填报退税
  • 固定资产内部调拨流程
  • 中央非税收入统一票据怎么做账
  • 存货相关的会计科目
  • 股息收入属于应税收入吗
  • 能够影响现金流的因素有
  • 物业营改增什么时候开始
  • 面对通过网络涌入的大量信息,我们应该学会
  • 公司注销时债权债务怎么处理
  • linux禁用root用户
  • 合伙企业需要交哪些税
  • 台式电脑开不了机怎么办 屏幕黑屏
  • 树木种植公司
  • 如何将iphone照片导入电脑里
  • Qq浏览器里的文档怎么以文件形式发送
  • win10平板模式怎么打开
  • php替换字符串中的某个字符
  • iframe frame
  • 宜搭下载
  • 水獭冬眠吗?
  • 出口抵扣进项的设备免税依据
  • vuexl
  • 资产减值损失的借贷方向
  • 机械租赁税率是多少?
  • 凭证过账后发现了错误,如何处理
  • 现金流量表里的其他指的是什么
  • 利息收入的会计科目怎么做
  • 个人所得税汇算清缴时间
  • 商品流通企业的种类
  • 收到境外企业顾问费
  • PostgreSQL教程(十):性能提升技巧
  • 如何根据科目余额表做资产负债表
  • 非营利组织如何盈利
  • 多记财务费用怎么调整
  • 小企业附加税减免政策
  • 开红字发票做账时记账凭证上如何写摘要?
  • 应付账款和预付账款都属于负债类科目
  • 企业筹建期间发生的费用应计入什么账户
  • 私营公司预收账款怎么算
  • 企业经营规模小怎么办
  • Slave memory leak and trigger oom-killer
  • win10怎么添加
  • bzc.exe是什么
  • cyb2k.exe是安全进程吗 cyb2k进程危险吗
  • windows10体验指数如何查看
  • mac修改文件名
  • scureapp.exe - scureapp是什么进程 有什么用
  • win7手动更新在哪里设置
  • window10 蓝牙鼠标
  • win8系统关机键找不见
  • win8系统打开浏览器
  • material design怎么用
  • android真机调试闪退
  • 在node.js中想要监听事件
  • JavaScript italics方法入门实例(把字符串显示为斜体)
  • 前端框架到底是什么
  • 印花税没有做税种认定
  • 小规模纳税人利润如何缴税
  • 写给税务局的表扬信
  • 物流公司怎么申请TIR
  • 个体工商户自己开普票流程
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设