sqlite3模块如何与电子一起使用?


88

我想使用电子开发桌面应用程序,该电子程序使用通过命令通过npm安装的sqlite3软件包

npm install --save sqlite3

但它在电子浏览器控制台中出现以下错误

Uncaught Error: Cannot find module 'E:\allcode\eapp\node_modules\sqlite3\lib\binding\node-v45-win32-x64\node_sqlite3.node'

我的开发环境是Windows 8.1 x64节点版本12.7

我的package.json文件如下所示:

{
  "name": "eapp",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "start": "electron ."
  },
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "electron-prebuilt": "^0.32.1"
  },
  "dependencies": {
    "angular": "^1.3.5",   
    "sqlite3": "^3.1.0"
  }
}

index.js文件

var app = require('app');
var BrowserWindow = require('browser-window'); 
require('crash-reporter').start();
var mainWindow = null;


app.on('window-all-closed', function() {  
    if (process.platform != 'darwin') {
        app.quit();
    }
});

app.on('ready', function() {
    // Create the browser window.
    mainWindow = new BrowserWindow({width: 800, height: 600}); 
    mainWindow.loadUrl('file://' + __dirname + '/index.html');   
    mainWindow.openDevTools();  
    mainWindow.on('closed', function() {       
        mainWindow = null;
    });
});

my.js文件

var sqlite3 = require('sqlite3').verbose();
var db = new sqlite3.Database('mydb.db');

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

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

    db.each("SELECT rowid AS id, info FROM lorem", function(err, row) {
        console.log(row.id + ": " + row.info);
    });
});

db.close();

index.html文件

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
<div >
    <div>
        <h2>Hello</h2>
    </div>

</div>
<!--<script src="js/jquery-1.11.3.min.js"></script>-->
<script src="js/my.js"></script>
</body>
</html>

Answers:


125

到目前为止,将SQLite与电子结合使用的最简单方法是使用electron-builder

首先,在您的package.json中添加一个postinstall步骤:

"scripts": {
   "postinstall": "install-app-deps"
   ...
}

然后安装必要的依赖项并进行构建:

npm install --save-dev electron-builder
npm install --save sqlite3
npm run postinstall

electronic-builder将为您的平台构建本机模块,并使用Electron绑定的正确名称;然后您就可以require像往常一样用代码编写它了。

参见我的github回购博客文章-我花了相当长的时间才弄清楚这一点。


1
使用电子样板-sqlite确实是更简单的方法,但使用npm install
Bernardo Ramos

1
当运行'npm run postinstall'时,出现此错误“一次在此解决方案中构建项目。要启用并行构建,请添加“ / m”开关。”
希拉格

到目前为止,这不仅节省了我的皮革,而且节省了两次!
约翰·内斯比

有谁知道--save sqlite3选项是否可以可靠地标记到第一行(带有--save-dev electron-builder),在第一行npm install只能运行一次?
菲利普(Phillip)

这对我不起作用,我收到类似../../nan/nan_object_wrap.h:67:18的错误:error:'class Nan :: Persistent <v8 :: Object>'没有名为'MarkIndependent'的成员`
迈克尔

21

我不推荐本机节点sqlite3模块。它需要重建才能与电子一起工作。这是一件非常痛苦的事情-至少我永远无法使它正常工作,并且他们没有在Windows上重建模块的说明。

相反,请查看kripken的“ sql.js”模块,该模块是sqlite3,已使用JavaScript进行了100%编译。 https://github.com/kripken/sql.js/


3
Electron文档非常清楚,为了使用捆绑的本机模块,需要重新构建它们才能使用电子。您可以使用大多数时间都可以使用的电子重建实用程序,也可以手动设置gyp标志:electron.atom.io/docs/tutorial/using-native-node-modules
Bret

1
抱歉,反应迟钝。 github.com/electron/electron-rebuild是在开发中进行重建的便捷工具。 github.com/electron-userland/electron-builder/wiki/…描述了用于生产构建的多平台构建策略。记住,一旦引入了本机dep,就会失去针对不同OS进行交叉编译的能力。github.com/nodejs/node-gyp#installation在必要的Windows编译器工具上有不错的文档。
Bret

1
这些评论均与该答案无关!
user3791372

14
应该提到的是sql.js不能在文件系统上运行。每次需要更改数据库时,都必须将整个内容写入磁盘。在大多数情况下,使其变得毫无用处。
mode777 '17

3
sql.js更像是一个玩具,很有趣。它不能比NeDB和其他nosql数据库更好,因为它会将所有数据库存储在内存中。因此,没有充分的理由使用它。对于小型数据库,请使用像NeDB这样的nosql,对于较大的数据库,您必须编译sqlite
Daimos

9

这里要考虑两个方面:

  1. 设置NODE_PATH:这使电子知道在哪里可以找到您的模块(有关详细说明,请参阅此答案
  2. 针对电子标头编译本机模块:请参阅官方文档

并检查以下问题,问同样的事情:


我的建议是尝试使用Lovefield(由Google提供)。


在Nodewebkit中,我必须编译sqlite。同样的规则适用于电子吗?
Wexoni 2015年

@Wexoni AFAIK每个具有本地绑定的节点模块都必须针对电子标头进行编译。
Yan Foto 2015年

1
@Wexoni我尚未与NW合作,但我知道sqlite3必须先对其进行编译,然后才能在电子中使用它。我是否正确理解您的问题?
Yan Foto 2015年

1
@YannBertrand他们仍然使用自己的标头。所以我想您仍然需要针对他们的标头进行编译。
Yan Foto 2016年

1
谢谢你给小费的爱人。这确实是一个很棒的图书馆。
Mostasim Billah

7

我有同样的问题。尝试了一切,最后这对我有用:-

npm install --save sqlite3
npm install --save electron-rebuild
npm install --save electron-prebuilt
.\node_modules\.bin\electron-rebuild.cmd

这将在。\ node_modules \ sqlite3 \ lib \ binding \位置中创建“ electron-v1.3-win32-x64”文件夹,电子将其用于使用sqlite3。

只需启动应用程序,您现在就可以使用sqlite3。


它只是创建一个空文件夹,但仍然没有node_sqlite3.node在它的文件
迈赫迪德赫加尼

电子预制的已重命名为电子。有关更多详细信息,请参见electron.atom.io/blog/2016/08/16/npm-install-electron
Jacob Nelson

6

一个更简单的解决方案:

  1. 安装电子重建 npm i electron-rebuild --save-dev
  2. 启动电子重建./node_modules/.bin/electron-rebuild(或.\node_modules\.bin\electron-rebuild.cmd在Windows上)
  3. 进入“ node_modules / sqlite3的/ lib中/结合/ ”和文件夹“重命名电子v0.36-达尔文-64 ”至“节点- V47 -darwin-64

PS:v47是我的版本,请小心选择一个好版本(在您的情况下是v45


4
您能解释一下第三步吗?为什么要重命名?
m4heshd '18



3
npm install --save sqlite3
npm install --save-dev electron-rebuild

然后,在package.json的脚本中,添加以下行:

"scripts": {
  "postinstall": "electron-rebuild",
  ...
},

然后只需重新安装即可触发安装后:

npm install

在复杂的用例中也能完美地为我工作,其中涉及电子生成器,电子webpack和续集。

它适用于electronic-webpack的dev模式和Windows和Linux的生产模式。


2

这里看看类似的答案

TL; DR

cd .\node_modules\sqlite3
npm install nan --save
npm run prepublish
node-gyp configure --module_name=node_sqlite3 --module_path=../lib/binding/electron-v1.3-win32-x64
node-gyp rebuild --target=1.3.2 --arch=x64 --target_platform=win32 --dist-url=http://electron.atom.io/ --module_name=node_sqlite3 --module_path=../lib/binding/electron-v1.3-win32-x64

3
脚本是什么prepublish样的?
维克多·艾文斯

0

您可以使用Visual Studio手动构建本机模块。

  1. 下载Visual Studio 2019。
  2. 安装程序包“使用C ++进行桌面开发”。在安装详细信息选项卡中,选择“ MSVC v140-VS 2015 C ++生成工具(v14.00)”
  3. 在您的项目中下载electronic-builder。
  4. 在package.json中创建一个脚本。“脚本”:{“ postinstall”:“ install-app-deps”}

  5. 然后运行脚本。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.