爱智EdgerOS之深入解析如何在EdgerOS中使用SQLite3数据库引擎

一、SQLite 简介

  • 数据管理是应用开发者最常遇到的挑战之一,无论是支付宝的余额,或是京东购物车里的商品,都需要存储在对应服务后端的数据库中,以满足用户查询、转账、购买等各种各样的使用场景。
  • EdgerOS 智能边缘计算操作系统内置了多种数据库能力,比如 EdgerOS 的媒体中心模块,可以完成视频、照片、文本等数据文件的管理。另外 EdgerOS 自身还搭载了多个常用的数据库客户端如 MySQL、Redis,方便使用者连接外部数据库,同时自身也搭载了 SQLite3 数据库引擎,能够满足不同业务场景下开发者自由定制数据管理的需求。
  • SQLite 是一种轻量型、进程内的关系型数据库, 它实现了一个自包含的、无服务器的、零配置的事务性 SQL 数据库引擎。SQLite 是世界上最广泛部署的 SQL 数据库引擎,在最新的 DB-Engines 排名中 SQLite 位居第七,且常年保持在前十名。

在这里插入图片描述

二、SQLite3 数据类型

  • SQLite3 数据库有以下数据类型:
    • NULL 空值。
    • INTEGER 有符号的整数。
    • REAL 双精度浮点数。
    • TEXT 文本类型可以支持 UTF-8、UTF-16 编解码。
    • BLOB 二进制数据类型。
  • SQLite3 支持亲和类型的概念,在使用 SQL 语句构建表单时,仍可以使用 SQL 中任何数据类型,但当真正插入数据时,该类型的数据将优先采用亲和类型作为该值的存储方式。
  • 下表列出了亲和类型的对应关系:

在这里插入图片描述

三、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 客户端模块,感兴趣的开发者们可以进入官方文档中查看。

猜你喜欢

转载自blog.csdn.net/Forever_wj/article/details/134883133