在electron里面使用sqlite,其实就是在node里面使用sqlite。基本使用方法是一致的,只不过,sql语句可以在主进程中使用,也可以在渲染进程(即传统意义上的网页)上使用,在这点上,是稍稍有点区别。本文相关的环境安装文章是:https://newsn.net/say/electron-install-sqlite3.html 。如果您还没有安装好环境,请参照相关文章先安装好环境。在本文中,苏南大叔将要讲述在electron中,sqlite的增删改查的小例子。本文中的相关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();
});

上述代码的运行结果是,建立了一个数据表,然后插入了十条数据。注意,上述代码在『虚拟』数据库的情况下,每次数据表里面都只有十条数据。而对于数据库文件固化下来的情况,第二次运行的时候,数据表的总数据量是二十条了。

增删改查例子

对于增加删除或者修改,都可以使用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/API electron下安装sqlite环境 https://newsn.net/say/electron-install-sqlite3.html 结论 值得特别说明的是:在electron里面使用sqlite的语句,和在node里面使用sqlite是一样的体验。本篇文章的大部分内容,并不仅仅适用于electron。在纯正的node代码里面,也是一样适用的。