一文掌握在 EdgerOS 中使用 SQLite3 数据库引擎

leecactus0 2022-06-16 16:00:43

数据管理是应用开发者最常遇到的挑战之一,无论是支付宝的余额,或是京东购物车里的商品,都需要存储在对应服务后端的数据库中,以满足用户查询、转账、购买等各种各样的使用场景。

 

EdgerOS 智能边缘计算操作系统内置了多种数据库能力,比如 EdgerOS 的媒体中心模块,可以完成视频、照片、文本等数据文件的管理。另外 EdgerOS 自身还搭载了多个常用的数据库客户端如 MySQL、Redis,方便使用者连接外部数据库,同时自身也搭载了 SQLite3 数据库引擎,能够满足不同业务场景下开发者自由定制数据管理的需求。

 

本文将带大家一起了解 EdgerOS 中所集成的数据库引擎之一:SQLite3。

 

 

SQLite 介绍

SQLite 是一种轻量型、进程内的关系型数据库, 它实现了一个自包含的、无服务器的、零配置的事务性 SQL 数据库引擎。SQLite 是世界上最广泛部署的 SQL 数据库引擎,在最新的 DB-Engines 排名中 SQLite 位居第七,且常年保持在前十名。

 

 

SQLite3 数据类型

SQLite3 数据库有以下数据类型:

  • NULL 空值。

  • INTEGER 有符号的整数。

  • REAL 双精度浮点数。

  • TEXT 文本类型可以支持 UTF-8、UTF-16 编解码。

  • BLOB 二进制数据类型。

SQLite3 支持亲和类型的概念,我们在使用 SQL 语句构建表单时,仍可以使用 SQL 中任何数据类型,但当真正插入数据时,该类型的数据将优先采用亲和类型作为该值的存储方式。

 

下表列出了亲和类型的对应关系:

 

 

现在我们已经对 SQLite3 有了一些初步认识,接下来进入本文主题:如何在 EdgerOS 中使用 SQLite3 数据库引擎。

 

 

EdgerOS SQLite3 

EdgerOS 将 SQLite3 数据库封装在了 “sqlite3” 模块中,应用开发时可以使用以下代码来导入该模块。


const Sqlite3 = require('sqlite3');

首先我们需要初始化一个 SQLite3 实例对象,通过调用该对象的 API 接口完成对数据库引擎的操作。

 

new Sqlite3(fileName[, flags])

  • fileName {String} 数据文件存放地址,当 fileName 为 ':memory:' 时,意味着创建一个匿名的内存数据库。

  • flags {String} 文件访问类型 默认使用 "c+"

 

可以通过以下代码生成数据库的实例,如果所传入的数据文件不存在,将默认创建该文件。

const db = new Sqlite3(':memory:');
// or
const db = new Sqlite3('./test.db');

也可以通过 open 方法打开一个数据库实例,区别在于 open  方法不会抛出异常,返回值为 undefined 时表示打开失败。

 

Sqlite3.open(fileName[, flags ])

  • fileName {String}  数据文件存放地址

  • flags {String}  文件访问类型 默认使用 "c+"

接下来我们通过这个数据库实例来完成对数据库引擎的具体操作。


const db = Sqlite3.open('./test.db')

现在我们已经拥有了数据库实例,接下来通过该实例执行 SQL 语句,完成建表、增、删、改、查等操作。执行 SQL 语句只需要使用实例中的 run 方法即可完成。

 

db.run(sql[, ...bind[, query[, arg]])

  • sql {String} 需要执行的 SQL 语句

  • ...bind {Any} 根据 SQL 语句中的 '?' 绑定的变量,默认情况下不绑定变量

  • query {Function} 查询语句回调方法如果是查询语句,被查询的每条记录都会回调这个函数。

    • arg {Any} 可选的回调参数

    • row {Object} 查询结果对象

  • arg {Any} 设置查询语句的 arg 回调参数,默认为:undefined

 

所以根据以上描述只需要使用 run 指令便可以完成对数据库表数据的操作控制,接下来用简短的几行代码来看看实际应用的效果。

const Sqlite3 = require('sqlite3')
const db = Sqlite3.open('./test.db')
db.run('CREATE TABLE if not exists user(name text, age int);');

db.run('INSERT INTO user VALUES("Jack", 23);');
db.run('INSERT INTO user VALUES("Rose", 21);');

function queryCallback(row) {
    console.log('name', row.name, 'age', row.age);
}

db.run('SELECT * FROM user;', queryCallback);

[JSRE-CON]name Jack age 23
[JSRE-CON]name Rose age 21

 

SQLite3 事务操作

sqlite3 模块也同时提供了数据库事务操作 API,数据库事务是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成。

  • db.begin()

Begin 接口会打开一个事务。与db.run('BEGIN;')相同。

  • db.commit()

提交一个事务。与db.run('COMMIT;')相同。

  • db.rollback()

回滚一个事务。与db.run('ROLLBACK;')相同。

 

下面我们通过代码来简单了解一下 sqlite3 模块事务操作接口的使用。


const Sqlite3 = require('sqlite3')
const db = Sqlite3.open('./test.db')
db.run('CREATE TABLE if not exists user(name text, age int);');


db.begin();
db.run('INSERT INTO user VALUES("Jack", 23);');
db.run('INSERT INTO user VALUES("Rose", 21);');
db.commit();

db.begin();
db.run('INSERT INTO user VALUES("Allson", 23);');
db.run('INSERT INTO user VALUES("Babs", 21);');
db.rollback()

db.begin();
db.run('INSERT INTO user VALUES("Chrissie", 23);');
db.run('INSERT INTO user VALUES("Debby", 21);');
db.commit();

function queryCallback(row) {
    console.log('name', row.name, 'age', row.age);
}

db.run('SELECT * FROM user;', queryCallback);

// 运行实际输出结果
[JSRE-CON]name Jack age 23
[JSRE-CON]name Rose age 21
[JSRE-CON]name Chrissie age 23
[JSRE-CON]name Debby age 21

从实际运行的结果上我们可以了解到,Allson,Babs 完成插入操作后,紧接着运行了 rollback 方法触发数据回滚,所以在最后输出表中数据时,数据库中并不存在这两条数据记录。

 

相信通过本篇文章,大家对 EdgerOS 中 sqlite3 模块的使用方法已经有了初步的认识。在此之外 EdgerOS 系统中也包含了很多其他类型的数据库模块, 例如支持 K-V 存储的 LightKV 数据库引擎,自研的同步式数据库 SyncTable,以及我们网络开发中经常使用的的  mysql 客户端模块,感兴趣的开发者们可以进入官方文档中查看。由于篇幅有限,我们就先聊到这里。希望本文可以让您在了解,学习 EdgerOS 的过程中更加顺畅。

 

参考链接:

SQLite3 官方文档:https://www.edgeros.com/edgeros/api/BASIC%20COMPONENTS/Database/sqlite3.html

EdgerOS 官网:https://www.edgeros.com/

 

...全文
178 回复 打赏 收藏 举报
写回复
回复
切换为时间正序
请发表友善的回复…
发表回复
相关推荐
发帖
爱智开发者社区
加入

1506

社区成员

爱智开发者平台是一个开放的物联网平台,通过爱智世界,应用开发者可以把自己的应用分发到亿万用户的设备上,硬件开发者能够把设备能力开放给海量的开发者,让优质的应用脱颖而出,为用户提供更优秀的使用体验。
社区管理员
  • EdgerOS
  • Lumos_zbj
  • dayinfinite
帖子事件
创建了帖子
2022-06-16 16:00
社区公告
暂无公告