electron 搭配 sqlite 数据库之数据交互
发布于 作者:苏南大叔 来源:程序如此灵动~在electron
里面使用sqlite3
,其实就是在node
里面使用sqlite3
,两者的基本使用方法是一致的。只不过,在electron
里面,sql
语句可以在主进程中使用,也可以在渲染进程(即传统意义上的网页)上使用,在这点上,是稍稍有点区别。
本文相关的环境安装文章是:https://newsn.net/say/electron-install-sqlite3.html 。如果您还没有安装好环境,请参照相关文章先安装好环境。在本文中,苏南大叔将要讲述在electron
中,sqlite3
的增删改查的小例子。本文中的相关api
函数,都可以在文末的链接中找到函数说明。
初始化数据库连接
sqlite3
的数据库初始化,需要指定一下数据库的位置。这个数据库文件可以是个实体的文件数据库,也可以是一个仅存在于内存中的虚无的数据库。
1:初始化一个仅仅存在于内存中的数据库。
程序关闭的话,数据就会消失,并不会保存下来。因为数据会丢失,所以使用的情况也不是很多。
var sqlite3 = require('sqlite3').verbose();
var db = new sqlite3.Database(':memory:');
2:初始化一个独立文件。
大部分情况下,我们都是使用这种初始化链接的方法的。
- 这种情况下,需要注意一下数据库文件的路径写法。我们必须写成
path.join
这种写法,否则我们的作品在调试阶段是ok的,但是一旦build成品后,就会报“找不到db文件”之类的错误。 - 这个
db.db
在第一次运行的时候,如果不存在的话,是会自动建立的,至少调试阶段是可以自动建立的。但是还是要注意第一点:请使用path.join
这种写法,切记切记。
var sqlite3 = require('sqlite3').verbose();
const path = require('path');
var db = new sqlite3.Database(path.join(__dirname, 'db.db'));
//var db = new sqlite3.Database('db.db');
初始化数据结构及数据
下面的例子是个官方给出的初始化数据的例子,大家先看看。函数名都有些奇怪,不过我们可以先照猫画虎。
db.serialize(function() {
db.run("CREATE TABLE IF NOT EXISTS lorem (info TEXT)");
//db.run("delete from lorem");
var stmt = db.prepare("INSERT INTO lorem VALUES (?)");
for (var i = 0; i < 10; i++) {
stmt.run("Ipsum " + i);
}
stmt.finalize();
});
上述代码的运行结果是,建立了一个数据表,然后插入了十条数据。注意,上述代码在『虚拟』数据库的情况下,每次数据表里面都只有十条数据。而对于数据库文件固化下来的情况,第二次运行的时候,数据表的总数据量是二十条了。
serialize
,可以使内部的sql
语句都顺序执行。(node
的函数都是异步的,你懂的)所以这个函数应该多多重点使用。
https://github.com/mapbox/node-sqlite3/wiki/Control-Flow
run
,执行一条sql语句。这个就相当于mysql中最常见的query
或者execute
。如果你需要sql返回数据的话,当然也是有回调函数可以使用的。
https://github.com/mapbox/node-sqlite3/wiki/API#databaserunsql-param--callback
prepare
,本例中prepare
是和后面的run
和finalize
组合使用的,我们可以理解为一个安全的字符串拼接。这条语句在日常使用中也是经常使用的。
https://github.com/mapbox/node-sqlite3/wiki/API#databasepreparesql-param--callback
增删改查例子
对于增加删除或者修改,都可以使用run
来直接执行sql。但是我们要注意:对于会带入外部传递的参数的这种情况下,千万不能做简单的字符串拼接sql,我们需要使用参数来带入sql中的?
、?1
、$id
、:id
、@id
等,来完成sql的最终创建。
由于篇幅限制,我们先给出几个简单的例子,在下一篇文章中,苏南大叔再对这部分进行详细解读。
db.run("INSERT INTO lorem(info,info2) VALUES ($d1,$d2)",{$d1:"f1",$d2:"f2"},function(err,res){
console.log(err,res,this.lastID);
});
db.run("delete from lorem where rowid > 1",function(err,res){
console.log(err,res,this.changes,this.lastID);
});
db.run("UPDATE lorem SET info = ? WHERE rowid = ?", [ "bar", 2 ]);
db.get("select * from lorem where rowid=?",[1],function(err,res){
console.log(err,res);
});
db.all("select * from lorem",function(err,res){
console.log(err,res);
});
这里仅做最基本的应用举例。所以,也仅作基本说明。
get()
是获取一条数据,all()
是获取多条数据。- 回调函数作用域里,第一个形参
err
,正常情况下为null,不为null的时候就是有错误发生了。 - 回调函数作用域里,第二个形参
res
,当且仅当查询数据的时候,会有数据返回。其他时候没有什么用途。数据查询get()
或者all()
的时候,这个形参res
就非常重要了。 - 回调函数作用域里,还存在一个隐藏的
this
,个别函数里的this
,会出现自增的rowid
和changes
,作为执行结果返回。就是说影响了几条数据,最后插入的id
是什么。大概如此这般,大家console
输出一下结构,就很容易明白了。
结束数据库连接
结束数据库链接......
db.close();
相关链接
node-sqlite3
的API
函数说明 https://github.com/mapbox/node-sqlite3/wiki/APIelectron
下安装sqlite
环境 https://newsn.net/say/electron-install-sqlite3.html
结论
值得特别说明的是:在electron
里面使用sqlite3
的语句,和在node
里面使用sqlite3
是一样的体验。本篇文章的大部分内容,并不仅仅适用于electron
,在纯正的node
代码里面,也是一样适用的。
更多sqlite
范例,请关注苏南大叔的更多sqlite
经验文章。https://newsn.net/tag/sqlite/ 。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。
使用vue-cli-plugin-electron-builder开发时,在Vue方法中链接数据库报错asyncToGenerator.js?c973:6 Uncaught (in promise) Error: SQLITE_CANTOPEN: unable to open database file,直接使用node 命令就正常,这是什么原因啊
不知道是否支持加密的sqltie
在使用 sqlite3.Database() 的时候报错
TypeError: Use the new operator to create new Database objects
是什么原因啊
没见过
苏南大叔你好!请问一下sqlite 加密数据库有弄过吗
木
苏南大叔 你好!,请问一下数据库有很多 比如nedb、lowdb,indexDB和sqlite,不知道那个数据库会比较适合
好像很多人用的是nedb....
苏南大叔,你好!非常感谢你写的关于electron与sqlite系列的文章。我最近也在倒腾electron和sqlite,但是遇到了一个难题,所以在此向您请教。
我使用了electron-vue + sqlite3 ,我在本地使用,从数据库中读取数据都是能正常显示数据库内容,但是我把项目打包后,显示数据库内容的地方就是一片空白,我想应该是数据库的内容没有读取出来,但是不是很确定,也不知道打包后要怎么调试,望苏南大叔指导下怎么办?如果可以,我愿意把demo发到您邮箱,希望苏南大叔帮忙看下。
你看看这篇文章先。https://newsn.net/say/electron-packager-extra-resource.html 。打包后,你依然可以打开开发者模式的,里面的console会有调试信息。
学习进步
写的很好,崇拜大神