我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

electron里面使用sqlite3,其实就是在node里面使用sqlite3,两者的基本使用方法是一致的。只不过,在electron里面,sql语句可以在主进程中使用,也可以在渲染进程(即传统意义上的网页)上使用,在这点上,是稍稍有点区别。

苏南大叔:electron 搭配 sqlite 数据库之数据交互 - electron-sqlite
electron 搭配 sqlite 数据库之数据交互(图4-1)

本文相关的环境安装文章是: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');

苏南大叔:electron 搭配 sqlite 数据库之数据交互 - dbdb
electron 搭配 sqlite 数据库之数据交互(图4-2)

苏南大叔:electron 搭配 sqlite 数据库之数据交互 - 003
electron 搭配 sqlite 数据库之数据交互(图4-3)

苏南大叔:electron 搭配 sqlite 数据库之数据交互 - 004
electron 搭配 sqlite 数据库之数据交互(图4-4)

初始化数据结构及数据

下面的例子是个官方给出的初始化数据的例子,大家先看看。函数名都有些奇怪,不过我们可以先照猫画虎。

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是和后面的runfinalize组合使用的,我们可以理解为一个安全的字符串拼接。这条语句在日常使用中也是经常使用的。

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,会出现自增的rowidchanges,作为执行结果返回。就是说影响了几条数据,最后插入的id是什么。大概如此这般,大家console输出一下结构,就很容易明白了。

结束数据库连接

结束数据库链接......

db.close();

相关链接

结论

值得特别说明的是:在electron里面使用sqlite3的语句,和在node里面使用sqlite3是一样的体验。本篇文章的大部分内容,并不仅仅适用于electron,在纯正的node代码里面,也是一样适用的。

更多sqlite范例,请关注苏南大叔的更多sqlite经验文章。https://newsn.net/tag/sqlite/

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   electron    sqlite