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

增删改查crud之r,实际上英文单词是Retrieve[rɪˈtri:v]。单词似乎不认识,所以苏南大叔认为:还是理解为read/select更好些嘛。哈哈。当然,本文的主角还是electron+sqlite。不会配置环境的,请参考文末链接。

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

在本文中,苏南大叔要描述的经验文章是:在electron中如何查询数据。

前置代码

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.serialize(()=> {
  db.run("INSERT INTO demo(info,info2) VALUES (?,?)",["test","test2"],function(err,res){
    console.log("11:",err,res,this.lastID);
  });
  db.run("select last_insert_rowid() newid2 from demo",function(err,res){
    console.log("12:",err,res,this.lastID);
  });
  db.run("select last_insert_rowid() from demo",function(err,res){
    console.log("13:",err,res,this.lastID);
  });
  db.get("select last_insert_rowid() as newid from demo",function(err,res){
    console.log("14:",err,res,this.lastID);
  });
});

这个的运行结果挺有意思的,第一条语句插入了一条记录,第二个语句中查询了一个不存在的字段,不但没报错,而且还给出了this.lastID,就是说,查询语句而不是插入语句中返回了this.lastID。第三条语句修复了第二条语句的问题,但是仍然返回了this.lastID。第四条语句中,确没有返回this.lastID,而是返回了last_insert_rowid()的值,当然值和上一条语句中this.lastID是相等的。并且出现了个res的返回值用于存放查询的数据。

苏南大叔:electron与sqlite,增删改查之select - sqlite_insert8
electron与sqlite,增删改查之select(图6-2)

get()

get()函数,只返回符合条件的第一条数据。例子如下:

db.get("select * from demo",function(err,res){
  console.log("15:",err,res,this.lastID);
});
db.get("select *,rowid from demo",function(err,res){
  console.log("16:",err,res,this.lastID);
});

这个返回值也比较奇怪,返回的是数据表里面的第一条数据,并且如果想知道隐藏的rowid的话,需要额外指出,并不包含在*之中。

苏南大叔:electron与sqlite,增删改查之select - sqlite_insert9
electron与sqlite,增删改查之select(图6-3)

all()

all()返回所有记录的对象组成的数组到res中。

db.all("select * from demo",function(err,res){
  console.log("16:",err,res,this.lastID);
});

苏南大叔:electron与sqlite,增删改查之select - sqlite_insert10
electron与sqlite,增删改查之select(图6-4)

each()

each()返回的数据也是所有数据,但是这些数据是单条返回的,就是说有N条数据的话,就返回了N次,callback调用N次。这个函数够特别吧?头一次看到还有这么干的函数。每次的返回值都是object对象,存放在res之中。

db.each("select * from demo",function(err,res){
  console.log("17:",err,res,this.lastID);
});

苏南大叔:electron与sqlite,增删改查之select - sqlite_insert11
electron与sqlite,增删改查之select(图6-5)

一个传参并且async的例子

当然,传递参数的方式太多,请参照insert中的run()参数方式:

(async function () {
  function read() {
      return new Promise((resolve, reject) => {
          db.all('select * from demo where 1 = ?', 1, (err, rows) => {
              if (err !== null) reject(err);
              if (rows && rows.length > 0) {
                resolve(rows);
              }
              else reject(err);
          });
      });
  }
  let result = await read();
  console.log(result);
})();

苏南大叔:electron与sqlite,增删改查之select - sqlite_insert12
electron与sqlite,增删改查之select(图6-6)

相关链接

总结

get()/all()/each()/run()都可以拿到数据,但是各有区别。参数的传递方式都是一致的,请参照run()函数的相关说明。(官方文档里面也是这么讲的)。

更多精彩sqlite经验文章,苏南大叔提示您:请点击这里:

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

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

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

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