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

本文的主角是electronsqlite,但是事实上:我们也可以理解为nodesqlitesqlite这个小巧的数据库,是非常适合小型项目的使用的。大家可以了解一下。本文要介绍的是crud中的c,也就是create/insert

苏南大叔:electron与sqlite,增删改查之insert - electron-sqlite-insert
electron与sqlite,增删改查之insert(图4-1)

node + sqlite里面的函数名,和以往我们已知的数据库函数名都是不一样的。很奇怪,而且参数传递方式也是多种多样的。这个就是本文的主要内容了。

基本描述

将要展示的基础代码是基于electronsqlite的,所以,苏南大叔认为:读者已经安装好了相关的开发环境,并且可以正常使用了。如果您还没有准备好,您可以先看看本文末尾“相关链接”里面的环境安装内容。

代码的运行环境是electron的渲染进程。也就是说,我们可以理解为普通网页中的某个js文件即可。其实insert操作也是比较简单的,但是insert代码也是有好几种姿势的,请阅读下面的内容。

下面的所有的代码的前提是,这段代码不解释,以前的文章里面有写基础代码的含义。

var sqlite3 = require('sqlite3').verbose();
const path = require('path');
var db = new sqlite3.Database(path.join(__dirname, 'db.db'));
db.serialize(function() {
    db.run("CREATE TABLE if not exists demo (info TEXT,info2 TEXT)");
});
// db.close();

run()不同的参数传入方式

db.run("INSERT INTO demo(info) VALUES (?)","test",function(err,res){
  console.log("1:",err,res,this.lastID);
});
db.run("INSERT INTO demo(info,info2) VALUES ((?),(?))",["test","test2"],function(err,res){
  console.log("2:",err,res,this.lastID);
});
db.run("INSERT INTO demo(info,info2) VALUES (?,?)",["test","test2"],function(err,res){
  console.log("3:",err,res,this.lastID);
});
db.run("INSERT INTO demo(info,info2) VALUES ($d1,$d2)",{$d1:"f1",$d2:"f2"},function(err,res){
  console.log("4:",err,res,this.lastID);
});
db.run("INSERT INTO demo(info,info2) VALUES (?2,?1)",{1:"f1",2:"f2"},function(err,res){
  console.log("5:",err,res,this.lastID);
});
db.run("INSERT INTO demo(info,info2) VALUES (@d1,@d2)",{"@d1":"f1","@d2":"f2"},function(err,res){
  console.log("6:",err,res,this.lastID);
});
db.run("INSERT INTO demo(info,info2) VALUES (:d1,:d2)",{":d1":"f1",":d2":"f2"},function(err,res){
  console.log("7:",err,res,this.lastID);
});

这些语句的主要区别在于:参数的传递方式不同。注意里面的this.lastID。这个就是最后一次插入的id值,注意,建表语句中并没有id哦,这个id其实是sqlite的隐藏字段row_id。请点击这里查看:https://newsn.net/say/sqlite-mysql-autoincrement.html

运行的结果是这样的:

苏南大叔:electron与sqlite,增删改查之insert - sqlite_insert
electron与sqlite,增删改查之insert(图4-2)

serialize()内置其他函数

大家也许会发现上述结果输出是乱序的,那么请参考db.serialize()。下面是苏南大叔改造的上述代码。

db.serialize(()=>{
  db.run("INSERT INTO demo(info) VALUES (?)","test",function(err,res){
    console.log("1:",err,res,this.lastID);
  });
  db.run("INSERT INTO demo(info,info2) VALUES ((?),(?))",["test","test2"],function(err,res){
    console.log("2:",err,res,this.lastID);
  });
  db.run("INSERT INTO demo(info,info2) VALUES (?,?)",["test","test2"],function(err,res){
    console.log("3:",err,res,this.lastID);
  });
  db.run("INSERT INTO demo(info,info2) VALUES ($d1,$d2)",{$d1:"f1",$d2:"f2"},function(err,res){
    console.log("4:",err,res,this.lastID);
  });
  db.run("INSERT INTO demo(info,info2) VALUES (?2,?1)",{1:"f1",2:"f2"},function(err,res){
    console.log("5:",err,res,this.lastID);
  });
  db.run("INSERT INTO demo(info,info2) VALUES (@d1,@d2)",{"@d1":"f1","@d2":"f2"},function(err,res){
    console.log("6:",err,res,this.lastID);
  });
  db.run("INSERT INTO demo(info,info2) VALUES (:d1,:d2)",{":d1":"f1",":d2":"f2"},function(err,res){
    console.log("7:",err,res,this.lastID);
  });
});

运行结果就是顺序执行的了,ps一下:上述代码中用了es6的箭头函数语法。

苏南大叔:electron与sqlite,增删改查之insert - sqlite_insert3
electron与sqlite,增删改查之insert(图4-3)

用run()给prepare()传递参数

// 第一个demo
var tmp=db.prepare("INSERT INTO demo(info) VALUES (?)",function(err,res){
  console.log("8:",err,res,this.lastID);
});
tmp.run("test1");
tmp.run("test2");
tmp.run("test3");
tmp.finalize();
// 第二个demo
var tmp=db.prepare("INSERT INTO demo(info,info2) VALUES (?,?)",function(err,res){
  console.log("9:",err,res,this.lastID);
});
tmp.run("test1","aa1");
tmp.run(["test2","aa2"]);
tmp.finalize();

这种传值方法有个弊端,就是拿不到this.lastID了。非常不爽。

苏南大叔:electron与sqlite,增删改查之insert - sqlite_insert5
electron与sqlite,增删改查之insert(图4-4)

这里的run()和上边的run()显然不是一个函数,这里的run()仅仅是用来传递个参数罢了。大家要明白这个问题。

exec()

db.exec("INSERT INTO demo(info) VALUES ('test')",function(err,res){
  console.log("10:",err,res,this.lastID);
});
db.exec("INSERT INTO demo(info,info2) VALUES ('test','test2')",function(err,res){
  console.log("11:",err,res,this.lastID);
});

这个exec()方法,也拿不到this.lastID。虽然存在this,没有this.lastID。exec和run的区别在于,exec没有传递参数的方式,语句必须拼接获得。而run函数的传参方式太多太多了,目不暇接。

相关链接

结论

上述不同的代码,都是可以达到数据插入目的。但是,不同姿势的函数也是不一样的使用体验,对吧?如果您对苏南大叔的sqlite的经验技巧文章感兴趣,可以点击这里查看更多文章:https://newsn.net/tag/sqlite/

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

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

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

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