Come utilizzare il modulo sqlite3 con l'elettrone?


91

Voglio sviluppare un'app desktop utilizzando electron che utilizza il pacchetto sqlite3 installato tramite npm con il comando

npm install --save sqlite3

ma dà il seguente errore nella console del browser di Electron

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

Il mio ambiente di sviluppo è Windows 8.1 x64 node versione 12.7

il mio file package.json ha questo aspetto:

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

file 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;
    });
});

file 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();

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

Risposte:


126

Il modo di gran lunga più semplice per usare SQLite con l'elettrone è con electron-builder.

Innanzitutto, aggiungi un passaggio di postinstallazione nel tuo package.json:

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

e quindi installa le dipendenze necessarie e crea:

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

electron-builder costruirà il modulo nativo per la tua piattaforma, con il nome corretto per l'associazione Electron; e puoi quindi requirefarlo in codice come al solito.

Vedi il mio repository GitHub e il post sul blog : mi ci è voluto un po 'per capirlo.


1
Usare il tuo electron-boilerplate-sqlite è davvero il metodo più semplice, ma connpm install
Bernardo Ramos,

1
Quando ho eseguito "npm run postinstall", ho ricevuto questo errore "Creazione dei progetti in questa soluzione uno alla volta. Per abilitare la build parallela, aggiungere l'opzione" / m ".
chirag

Questo mi ha salvato la pelle non una, ma due volte finora!
John Nesbitt

Qualcuno sa se l' --save sqlite3opzione può essere etichettata in modo affidabile sulla prima riga (con --save-dev electron-builder), dove npm installverrebbe eseguita solo una volta?
Phillip il

Questo non funziona per me, ottengo errori come `../../nan/nan_object_wrap.h:67:18: errore: 'class Nan :: Persistent <v8 :: Object>' non ha membri denominati 'MarkIndependent' `
Michael,

21

Non consiglierei il modulo sqlite3 del nodo nativo. Richiede essere ricostruito per funzionare con l'elettrone. Questo è un enorme dolore da fare - Almeno non riesco mai a farlo funzionare e non sono istruzioni per ricostruire i moduli su Windows.

Dai un'occhiata invece al modulo 'sql.js' di kripken che è sqlite3 che è stato compilato al 100% in JavaScript. https://github.com/kripken/sql.js/


3
I documenti di Electron sono abbastanza chiari che per utilizzare moduli nativi in ​​bundle, è necessario ricostruirli per lavorare con electron. Utilizza l'utilità di ricostruzione elettronica che funziona la maggior parte del tempo o imposta manualmente i flag gyp: electron.atom.io/docs/tutorial/using-native-node-modules
Bret

1
Scusa per la risposta lenta. github.com/electron/electron-rebuild è uno strumento utile per la ricostruzione in fase di sviluppo. github.com/electron-userland/electron-builder/wiki/… descrive una strategia di build multi-piattaforma per build di produzione. Ricorda però, una volta che introduci deps nativi, perdi la capacità di cross-compilare per diversi sistemi operativi. github.com/nodejs/node-gyp#installation ha documenti decenti sugli strumenti necessari per il compilatore di Windows.
Bret

1
nessuno di questi commenti è rilevante per questa risposta!
user3791372

14
Va detto che sql.js non può operare sul filesystem. Ogni volta che devi cambiare il database devi scrivere il tutto su disco. Rendendolo praticamente inutile per la maggior parte degli scenari.
mode777

3
sql.js è più simile a un giocattolo, fatto per divertimento. Non può essere migliore di NeDB e altri database nosql, perché archivia tutti i database in memoria. Quindi non ci sono buone ragioni per usarlo. Per database di piccole dimensioni utilizzare nosql come NeDB, per i database più grandi è necessario compilare sqlite
Daimos

10

Due aspetti devono essere considerati qui:

  1. Impostazione NODE_PATH: consente a Electron di sapere dove trovare i moduli (vedere questa risposta per una spiegazione approfondita)
  2. Compilazione di moduli nativi contro intestazioni elettroniche: vedere la documentazione ufficiale

E controlla le seguenti domande, che chiedono la stessa cosa:


Il mio consiglio è di provare lovefield (di Google).


In Nodewebkit, devo compilare sqlite. La stessa regola vale per l'elettrone?
Wexoni

@Wexoni AFAIK ogni modulo di nodo con binding nativi deve essere compilato contro gli header di elettroni.
Yan Foto

1
@Wexoni Non ho lavorato con NW, ma so che sqlite3deve essere compilato prima di poterlo usare in electron. Capisco correttamente la tua domanda?
Yan Foto

1
@YannBertrand usano ancora le proprie intestazioni. Quindi suppongo che dovresti ancora compilarlo contro le loro intestazioni.
Yan Foto

1
Grazie per il tuo suggerimento lovefield. È davvero una grande libreria.
Mostasim Billah

7

Stavo avendo lo stesso problema. Ho provato di tutto e almeno questo ha funzionato per me: -

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

Questo creerà la cartella "electron-v1.3-win32-x64" in. \ Node_modules \ sqlite3 \ lib \ binding \ location che viene utilizzata da electron per usare sqlite3.

Basta avviare l'applicazione e sarai in grado di utilizzare sqlite3 ora.


Ha appena creato una cartella vuota, ma ancora nessun node_sqlite3.nodefile al suo interno
Mehdi Dehghani

electron-prebuilt è stato ribattezzato electron. Per maggiori dettagli, vedere electron.atom.io/blog/2016/08/16/npm-install-electron
Jacob Nelson

6

Una soluzione più semplice:

  1. Installa la ricostruzione elettronica npm i electron-rebuild --save-dev
  2. Avvia la ricostruzione elettronica ./node_modules/.bin/electron-rebuild(o .\node_modules\.bin\electron-rebuild.cmdsu Windows)
  3. Vai a " node_modules / sqlite3 / lib / binding / " e rinomina la cartella " electron-v0.36-darwin-x64 " in " node- v47 -darwin-x64 "

PS: v47 è la mia versione, fai attenzione a scegliere quella buona (nel tuo caso v45 )


4
Puoi spiegare il terzo passaggio? Perché rinominare?
m4heshd

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

Quindi, negli script del tuo package.json, aggiungi questa riga:

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

Quindi reinstalla per attivare la post-installazione:

npm install

Funziona perfettamente per me in un caso d'uso complesso che coinvolge anche il generatore di elettroni, il webpack di elettroni e il sequelize.

Funziona in modalità dev di electron-webpack e in modalità di produzione sia per Windows che per Linux.




2

Dai un'occhiata a una risposta simile qui

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
com'è lo script prepublish?
Victor Ivens

0

È possibile creare manualmente i moduli nativi utilizzando Visual Studio.

  1. Scarica visual studio 2019.
  2. Installa il pacchetto "sviluppo desktop con c ++". Nella scheda dei dettagli dell'installazione selezionare "MSVC v140 - Strumenti di compilazione C ++ VS 2015 (v14.00)"
  3. Scarica electron-builder nel tuo progetto.
  4. In package.json creare uno script. "scripts": {"postinstall": "install-app-deps"}

  5. quindi esegui lo script.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.