113

I want to develop desktop app using electron that uses sqlite3 package installed via npm with the command

npm install --save sqlite3

but it gives the following error in electron browser console

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

My development environment is windows 8.1 x64 node version 12.7

my package.json file looks like this:

{
  "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 file

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 file

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 file

<!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>

10 Answers 10

144

By far the easiest way to use SQLite with electron is with electron-builder.

First, add a postinstall step in your package.json:

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

and then install the necessary dependencies and build:

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

electron-builder will build the native module for your platform, with the correct name for the Electron binding; and you can then require it in code as normal.

See my github repo and blog post - it took me quite a while to figure this out too.

Sign up to request clarification or add additional context in comments.

8 Comments

Using your electron-boilerplate-sqlite is indeed the easier method, but with npm install
when run 'npm run postinstall', i got this error "Building the projects in this solution one at a time. To enable parallel build, please add the "/m" switch."
This has saved my hide not once, but twice so far!
The easiest way to use sqlite3 with electron apps is to follow sqlite3 documentation here : npmjs.com/package/sqlite3#custom-builds-and-electron. Works for me on electron 8.3.0, no rebuild required. I'm just giving more visibility to Sailab Rahi's answer.
Shouldn't it be "postinstall": "electron-builder install-app-deps" ?
|
23

I would not recommend the native node sqlite3 module. It requires being rebuild to work with electron. This is a massive pain to do - At least I can never get it to work and their a no instructions to for rebuilding modules on windows.

Instead have a look at kripken's 'sql.js' module which is sqlite3 that has been compiled 100% in JavaScript. https://github.com/kripken/sql.js/

10 Comments

Electron docs are pretty clear that in order to use bundled native modules, you are required to rebuild them in order to work with electron. Either use the electron-rebuild utility which works most of the time or manually set the gyp flags: electron.atom.io/docs/tutorial/using-native-node-modules
Sorry for the slow response. github.com/electron/electron-rebuild is a handy tool for rebuilding in development. github.com/electron-userland/electron-builder/wiki/… describes a multi-platform build strategy for production builds. Jut remember, once you introduce native deps, you lose the ability to cross compile for different OSs. github.com/nodejs/node-gyp#installation has decent docs on necessary windows compiler tools.
none of these comments are relevant to this answer!
It should be mentioned that sql.js can not operate on the filesystem. Everytime you need to change the database you have to write the whole thing to disk. Making it pretty much useless for most scenarios.
sql.js its more like a toy, made for fun. It cannot be better than NeDB and other nosql databases, because its store all database in memory. So there is no good reason to use it. For small database use nosql like NeDB, for larger you have to compile sqlite
|
12

Two aspects are to be considered here:

  1. Setting NODE_PATH: this lets electron know where to find your modules (see this answer for a thorough explanation)
  2. Compiling native modules against electron headers: see official docs

And checkout the following questions, that ask the same thing:


My tip would be to give lovefield (by Google) a try.

10 Comments

In Nodewebkit, I must compile the sqlite. Same rule apply for the electron?
@Wexoni AFAIK every node module with native bindings must be compiled against electron headers.
@Wexoni I haven't worked with NW, but I know that sqlite3 must be compiled before being able to use it in electron. Am I understanding your question correctly?
@YannBertrand they still use own headers. So i suppose you'd still need to compile it against their headers.
Thanks for your tip lovefield. It's really a great library.
|
11
npm install --save sqlite3
npm install --save-dev electron-rebuild

Then, in the scripts of your package.json, add this line:

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

Then just re-install to trigger the post-install:

npm install

Works flawlessly for me in a complex use case also involving electron-builder, electron-webpack and sequelize.

It works in electron-webpack's dev mode and in production mode for both Windows and Linux.

Comments

8

I was having same problem. Tried everything and atlast this worked for me :-

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

This will create "electron-v1.3-win32-x64" folder in .\node_modules\sqlite3\lib\binding\ location which is used by electron to use sqlite3.

Just start application and you will be able to use sqlite3 now.

2 Comments

It just created an empty folder, but still no node_sqlite3.node file in it
electron-prebuilt has been renamed to electron. For more details, see electron.atom.io/blog/2016/08/16/npm-install-electron
5

A simpler solution:

  1. Install electron-rebuild npm i electron-rebuild --save-dev
  2. Launch electron-rebuild ./node_modules/.bin/electron-rebuild (or .\node_modules\.bin\electron-rebuild.cmd on windows)
  3. Go to "node_modules/sqlite3/lib/binding/" and rename the folder "electron-v0.36-darwin-x64" to "node-v47-darwin-x64"

PS: v47 is my version, be careful to choose the good one (in your case v45)

3 Comments

Can you explain the third step? Why rename?
I don't remember exactly now but probably because the end of the path was hardcoded. It's looking for something like node-v${version}-darwin-x64.
Lol thank you for replying after 4 years @fabien-sa. It reminded me how much I've grown since then. Now I'm maintaining my own SQLite3 library. 😁
5

It works for me in version 3 and 4, unfortunately NOT version 5. See the sqlite3 documentation for details: https://www.npmjs.com/package/sqlite3#custom-builds-and-electron or otherwise run the following line: npm install sqlite3 --runtime=electron --target=4.0.0 --dist-url=https://atom.io/download/electron

1 Comment

That was my problem with sqlite3 and electron8.3.0, and it works, thanks.
2

Have a look at a similar answer here

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

2 Comments

what the script prepublish looks like?
linked similar answer is 404
2

I encounter this error too. Here is how i solve it: npm install --save-dev electron-rebuild then: ./node_modules/.bin/electron-rebuild

from: https://electronjs.org/docs/tutorial/using-native-node-modules

ps: While it's on rebuilding, don't use npm startto lanch the electron app. Otherwise the rebuild process would fail.

Comments

0

You can manually build the native modules using visual studio.

  1. Download visual studio 2019.
  2. Install package "desktop development with c++". In installation details tab select "MSVC v140 - VS 2015 C++ build tools (v14.00)"
  3. Download electron-builder in your project.
  4. In package.json create a script. "scripts": { "postinstall": "install-app-deps" }

  5. then run the script.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.