【问题标题】:Use sqlite3 in electron, db.serialize dose not work properly在electron中使用sqlite3,db.serializer不能正常工作
【发布时间】:2018-03-28 15:20:35
【问题描述】:

package.json

{
  "main": "app/app.js",
  "scripts": {
    "postinstall": "install-app-deps",
    "start": "electron ."
  },
  "dependencies": {
    "sqlite3": "^3.1.8"
  },
  "devDependencies": {
    "electron-prebuilt-compile": "^1.7.9",
    "electron-builder": "^19.37.2",
    "electron-rebuild": "^1.6.0"
  }
}

index.html

<body>
  <div id="app"></div>
  <div id='database'></div>
  <script>
    var sqlite3 = require('sqlite3').verbose();
    var db = new sqlite3.Database('./test.db')
    db.serialize(function () {
      var stmt = db.all("select * from BK_GROUP", function (_, rows) {
        console.log('end1');
      })
      var stmt2 = db.all("select * from BK_GROUP", function (_, rows) {
        console.log('end2');
      })
    })
    console.log('out1');
    db.close();
  </script>
  <script src="main.js"></script>
</body>

我希望(根据sqlite3的api文档https://github.com/mapbox/node-sqlite3/wiki/Control-Flow)这段代码应该是这样输出的

end1
end2
out1

但真正的输出是

out1
end1
end2 

我按照网络上的一些说明,安装 electron-rebuild,然后运行它

./node_modules/.bin/electron-rebuild

它也找到了 sqlite3 并重建它,但这没有帮助。

我还在 package.json 的脚本中添加了 postinstall。

但如果我在纯 node.js 环境中运行此代码,它会输出正确的结果。


更多,如果我在电子中运行此代码,它会正确输出(先打印结束,然后输出)。唯一的区别是这段代码在内存中打开数据库,上面打开一个位于硬盘驱动器上的文件数据库。

<body>
    <h1>electron-boilerplate-sqlite</h1>
    <ul id="database">
    </ul>
    <script>
      var sqlite3 = require('sqlite3').verbose();
      var db = new sqlite3.Database(':memory:');

      db.serialize(function() {
        db.run("CREATE TABLE lorem (info TEXT)");

        var stmt = db.prepare("INSERT INTO lorem VALUES (?)");
        for (var i = 0; i < 10000; i++) {
          stmt.run("Ipsum " + i);
        }

        stmt.finalize();

        var rows = document.getElementById("database");
        db.each("SELECT rowid AS id, info FROM lorem", function(err, row) {
          var item = document.createElement("li");
          item.textContent = "" + row.id + ": " + row.info;
          rows.appendChild(item);
        });
        console.log('end')
        setTimeout(() => console.log('delay'), 1000);

      });
      console.log('out')

      db.close();
    </script>
  </body>

我现在能做什么?

【问题讨论】:

    标签: node.js sqlite electron


    【解决方案1】:

    你误解了javascript,db serialize是回调函数,所以console.log的顺序是正确的,但要记住一个

    Since serialize() doesn't return until the last of its internal queries has completed, using it will hold off the close() until the query has completed.

    【讨论】:

      猜你喜欢
      • 2021-11-16
      • 2013-06-29
      • 2021-06-28
      • 2019-12-04
      • 1970-01-01
      • 1970-01-01
      • 2014-02-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多