推荐sql.js——一款纯js的sqlite工具。

一、关于sql.js

sql.js(https://github.com/kripken/sql.js)通过使用Emscripten编译SQLite C代码,将SQLite移植到Webassembly。 它使用存储在内存中的虚拟数据库文件,因此不会保留对数据库所做的更改。 但是,它允许您导入任何现有的sqlite文件,并将创建的数据库导出为JavaScript类型的数组。

这里没有C绑定或node-gyp编译,sql.js是一个简单的JavaScript文件,可以像任何传统的JavaScript库一样使用。 如果您正在JavaScript中构建本机应用程序(例如,使用Electron),或者在node.js中工作,则您可能更喜欢使用SQLite与JavaScript的本地绑定(https://www.npmjs.com/package/sqlite3)。

SQLite是公共领域,sql.js是MIT许可的。

Sql.js早于WebAssembly,因此从asm.js项目开始。 它仍然支持asm.js以实现向后兼容。

二、为什么要用sql.js

在开发electron应用的时候如果想要使用sqlite3,步骤上除了npm安装以外还要rebuild,比较麻烦,参见electron官方文档之使用 Node 原生模块(https://electronjs.org/docs/tutorial/using-native-node-modules)。

如果你想找一个开箱即用的sql库,那么sql.js将是个不错的选择。sql.js是sqlite的Webassembly版,使用上和sqlite基本没有区别。sql.js支持浏览器端直接引入cdn,或者下载sql-wasm.js和sql-wasm.wasm到本地后引入,也支持npm导入。

三、在Electron项目中安装sql.js

1、假设我们已经搭建好了Electron的一个hello world项目,如https://xushanxiang.com/2019/11/installing-electron.html

2、安装sql.js

cnpm install sql.js --save

安装完后,查看目录结构:

tree node_modules/sql.js -L 2
node_modules/sql.js
├── AUTHORS
├── GUI
│   └── index.html
├── LICENSE
├── Makefile
├── README.md
├── cache
│   ├── check.txt
│   ├── extension-functions.c
│   └── sqlite-amalgamation-3280000.zip
├── dist
│   ├── sql-asm-debug.js
│   ├── sql-asm-memory-growth.js
│   ├── sql-asm.js
│   ├── sql-wasm-debug.js
│   ├── sql-wasm-debug.wasm
│   ├── sql-wasm.js
│   ├── sql-wasm.wasm
│   ├── worker.sql-asm-debug.js
│   ├── worker.sql-asm.js
│   ├── worker.sql-wasm-debug.js
│   └── worker.sql-wasm.js
├── examples
│   ├── GUI
│   ├── README.md
│   ├── persistent.html
│   ├── repl.html
│   ├── requireJS.html
│   ├── simple.html
│   └── start_local_server.py
├── index.html
├── out
│   ├── api.js
│   ├── extension-functions.bc
│   ├── sqlite3.bc
│   └── worker.js
├── package.json
├── sqlite-src
│   └── sqlite-amalgamation-3280000
└── src
├── api-data.coffee
├── api.coffee
├── exported_functions.json
├── exported_runtime_methods.json
├── exports.coffee
├── output-post.js
├── output-pre.js
├── shell-post.js
├── shell-pre.js
└── worker.coffee
9 directories, 41 files

dist目录文件说明详见 https://github.com/kripken/sql.js#versions-of-sqljs-included-in-the-distributed-artifacts

四、在Electron项目中,如何使用sql.js操作SQLite数据库

1、创建一个SQLite数据库

我们可以在命令行中创建,也可以通过在线SQL解释器(http://kripken.github.io/sql.js/examples/GUI/)创建并下载一个。

写代码时,大家可以参考由源代码中的注释生成的完整文档——http://kripken.github.io/sql.js/documentation/#http://kripken.github.io/sql.js/documentation/class/Database.html

我们使用后者下载一个数据库 sql.db 放到项目根目录。再看一下我们当前的项目文件结构:

d tree  -L 1
.
├── index.html
├── main.js
├── node_modules
├── package.json
└── sql.db
1 directory, 4 files

当然,我们也可以在项目运行时,动态创建一个,不过先创建静态文件目录,拷贝相关文件到静态文件目录。

→ mkdir -p static/js
→ cp node_modules/sql.js/dist/sql-wasm.* static/js/
→ ls static/js/
sql-wasm.js sql-wasm.wasm

再改动 index.html 文件内容:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>create the database</title>
</head>
<body>
<div id="result"></div>
<script src='./static/js/sql-wasm.js'></script>
<!--如果在主进程中,则用var initSqlJs=require('sql-wasm.js')-->
<script>
var fs = require("fs");
var config = {
// 指定加载sql-wasm.wasm文件的位置
locateFile: filename => `./static/js/${filename}`
};
initSqlJs(config).then(SQL => {
// 创建数据库
var db = new SQL.Database();
// 运行查询而不读取结果
db.run("CREATE TABLE test (col1, col2);");
// 插入两行:(1,111) and (2,222)
db.run("INSERT INTO test VALUES (?,?), (?,?)", [1,111,2,222]);
// 将数据库导出到包含SQLite数据库文件的Uint8Array
// export() 返回值: ( Uint8Array ) — SQLite3数据库文件的字节数组
var data = db.export();
// 由于安全性和可用性问题,不建议使用Buffer()和new Buffer()构造函数
// 改用new Buffer.alloc()、Buffer.allocUnsafe()或Buffer.from()构造方法
// var buffer = new Buffer(data);
var buffer = Buffer.from(data, 'binary');
// 被创建数据库名称
var filename = "d.sqlite";
fs.writeFileSync(filename, buffer);
document.querySelector('#result').innerHTML = filename + "Created successfully.";
});
</script>
</body>
</html>

如果你没有安装SQLiteStudio之类的软件,可以把上面动态创建的数据库文件载入http://kripken.github.io/sql.js/examples/GUI/,再执行下面SQL语句得到下面表格结果。

SELECT * FROM test
col1 col2
1 111
2 222

2、对SQLite数据库进行查询操作

替换 index.html 文件内容如下:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Execute SELECT sql</title>
</head>
<body>
<div id="result"></div>
<script src='./static/js/sql-wasm.js'></script>
<script>
var fs = require("fs");
var filebuffer = fs.readFileSync('d.sqlite');
var config = {
// 指定加载sql-wasm.wasm文件的位置
locateFile: filename => `./static/js/${filename}`
};
initSqlJs(config).then(SQL => {
// 加载数据库到内存中
var db = new SQL.Database(filebuffer);
var res = db.exec("SELECT * FROM test");
console.log(JSON.stringify(res));
// [{"columns":["col1","col2"],"values":[[1,111],[2,222]]}]
});
</script>
</body>
</html>

3、对SQLite数据库进行增、改、删操作

替换 index.html 文件内容如下:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Execute SELECT sql</title>
</head>
<body>
<div id="result"></div>
<script src='./static/js/sql-wasm.js'></script>
<script>
var fs = require("fs");
var filebuffer = fs.readFileSync('d.sqlite');
var config = {
// 指定加载sql-wasm.wasm文件的位置
locateFile: filename => `./static/js/${filename}`
};
initSqlJs(config).then(SQL => {
// 加载数据库到内存中
var db = new SQL.Database(filebuffer); // 插入两行:(1,111) and (2,222)
db.run("INSERT INTO test VALUES (?,?), (?,?)", [3,333,4,444]);
var res = db.exec("SELECT * FROM test");
console.log(JSON.stringify(res));
// [{"columns":["col1","col2"],"values":[[1,111],[2,222],[3,333],[4,444]]}] // 修改一行
db.run("UPDATE test SET col2=(?) WHERE col1=(?)", [3333,3]);
res = db.exec("SELECT * FROM test");
console.log(JSON.stringify(res));
// [{"columns":["col1","col2"],"values":[[1,111],[2,222],[3,3333],[4,444]]}] // 删除一行
db.run("DELETE FROM test WHERE col1=(?)", [4]);
res = db.exec("SELECT * FROM test");
console.log(JSON.stringify(res));
// [{"columns":["col1","col2"],"values":[[1,111],[2,222],[3,3333]]}] // 注意:上面的增、改、删都只是对载入内存中的数据进行变更,我们需要把内存中的数据再存入磁盘文件中,不然一切皆枉然。
var data = db.export();
var buffer = Buffer.from(data, 'binary');
fs.writeFileSync("d.sqlite", buffer);
document.querySelector('#result').innerHTML = "SQLite database changed.";
});
</script>
</body>
</html>

原文:https://xushanxiang.com/2019/11/electron-sql-js-sqlite.html

Electron中使用sql.js操作SQLite数据库的更多相关文章

  1. js -- 操作sqlite数据库

    最近看到一个使用js来操作sqlite数据库的,测试了一下,具体使用的是 js操作类: https://github.com/kripken/sql.js/(sqlite js 驱动) 异步请求:ht ...

  2. Android中SQLite数据库操作(1)——使用SQL语句操作SQLite数据库

    下面是最原始的方法,用SQL语句操作数据库.后面的"Android中SQLite数据库操作(2)--SQLiteOpenHelper类"将介绍一种常用的android封装操作SQL ...

  3. 用SQL语句操作Sqlite数据库的示例代码

    import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.databa ...

  4. 通过SQL语句操作Sqlite数据库

    一.数据库的创建 数据库版本为1 //Ctrl+Shift+U:大写 public static final String DATABASE_NAME ="zzw.db"; pub ...

  5. Android中操作SQLite数据库

    我又回到了安卓的学习当中,忙来忙去终于忙的差不多有时间做自己的事情了,这感觉实在是太棒了!!本来想写android的控件以及他们的监视器的,但是我查了查android的手册,基本上都能查到,但是查有些 ...

  6. UWP: 在 UWP 中使用 Entity Framework Core 操作 SQLite 数据库

    在应用中使用 SQLite 数据库来存储数据是相当常见的.在 UWP 平台中要使用 SQLite,一般会使用 SQLite for Universal Windows Platform 和 SQLit ...

  7. 无废话Android之android下junit测试框架配置、保存文件到手机内存、android下文件访问的权限、保存文件到SD卡、获取SD卡大小、使用SharedPreferences进行数据存储、使用Pull解析器操作XML文件、android下操作sqlite数据库和事务(2)

    1.android下junit测试框架配置 单元测试需要在手机中进行安装测试 (1).在清单文件中manifest节点下配置如下节点 <instrumentation android:name= ...

  8. 在IOS中使用DES算法对Sqlite数据库进行内容加密存储并读取解密

    在IOS中使用DES算法对Sqlite 数据库进行内容加密存储并读取解密 涉及知识点: 1.DES加密算法: 2.OC对Sqlite数据库的读写: 3.IOS APP文件存储的两种方式及读取方式. 以 ...

  9. JDBC访问及操作SQLite数据库

    SQLite 是一个开源的嵌入式关系数据库,其特点是高度便携.使用方便.结构紧凑.高效.可靠. 与其他数据库管理系统不同,SQLite 的安装和运行非常简单,在大多数情况下,只要确保SQLite的二进 ...

随机推荐

  1. js对象可扩展性和属性的四个特性(下)

    # js对象可扩展性和属性的四个特性(下) 一.前言 再次花时间回顾一下基础,毕竟要想楼建的好,地基就要牢固,嘻嘻! 在开始之前需要具备对prototype.__proto__.constructor ...

  2. HTML+CSS的小实例

    通过一个月以来对HTML5+CSS的学习.这篇随笔给大家来做一个简单的网页中常见的导航栏. 这些都称之为网页中的导航栏. 我简单的做了一个某宝和58同城的导航栏,供大家学习参考. 一.58同城导航栏: ...

  3. socket实现一个简单的echo服务

    服务端的实现: public class EchoServer{ //创建一个serverSocket private final ServerSocket serverSocket; //创建一个构 ...

  4. JWT攻击手册:如何入侵你的Token

    JSON Web Token(JWT)对于渗透测试人员而言,可能是一个非常吸引人的攻击途径.因为它不仅可以让你伪造任意用户获得无限的访问权限,而且还可能进一步发现更多的安全漏洞,如信息泄露,越权访问, ...

  5. RocketMQ 主题扩分片后遇到的坑

    目录 1.案情回顾 1.1 集群现状 1.2.RocketMQ 在线扩容队列 1.3 消息发送 2.问题暴露 3.问题分析 4.问题复盘 消息组接到某项目组反馈,topic 在扩容后出现部分队列无法被 ...

  6. Python3 并发编程2

    目录 进程互斥锁 基本概念 互斥锁的使用 IPC 基本概念 队列 生产者消费者模型 基本概念 代码实现 线程 基本概念 创建线程 线程互斥锁 进程互斥锁 基本概念 临界资源: 一次仅允许一个进程使用的 ...

  7. 【性能优化】404- 从 12.67s到1.06s 性能优化实战

    作者:jerryOnlyZRJ 来源:https://juejin.im/post/5b6fa8c86fb9a0099910ac91 本文是对之前同名文章的修正,将所有webpack3的内容更新为we ...

  8. 【JS】368- 浅析JavaScript异步

    一直以来都知道 JavaScript是一门单线程语言,在笔试过程中不断的遇到一些输出结果的问题,考量的是对异步编程掌握情况.一般被问到异步的时候脑子里第一反应就是 Ajax, setTimseout. ...

  9. Orleans[NET Core 3.1] 学习笔记(三)( 3 )服务端配置

    服务端配置 Silo通过SiloHostBuilder和许多补充选项类以编程方式进行配置. Silo配置有几个关键方面: Orleans集群信息 集群提供程序(不知道咋翻译) Silo到Silo和Cl ...

  10. 【Java Web开发学习】Spring MVC异常统一处理

    [Java Web开发学习]Spring MVC异常统一处理 文采有限,若有错误,欢迎留言指正. 转载:https://www.cnblogs.com/yangchongxing/p/9271900. ...