Wie benutzt man das sqlite3 Modul mit Elektronen?


86

Ich möchte eine Desktop-App mit Electron entwickeln , die das über npm installierte sqlite3-Paket mit dem Befehl verwendet

npm install --save sqlite3

In der Elektronenbrowser-Konsole wird jedoch der folgende Fehler angezeigt

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

Meine Entwicklungsumgebung ist Windows 8.1 x64 Node Version 12.7

Meine package.json- Datei sieht folgendermaßen aus:

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

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 Datei

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 Datei

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

Antworten:


123

Der mit Abstand einfachste Weg, SQLite mit Elektronen zu verwenden, ist mit electron-builder.

Fügen Sie zunächst einen Schritt nach der Installation in Ihr package.json ein:

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

und installieren Sie dann die erforderlichen Abhängigkeiten und erstellen Sie:

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

Electron-Builder erstellt das native Modul für Ihre Plattform mit dem korrekten Namen für die Elektronenbindung. und Sie können es dann requirewie gewohnt im Code.

Siehe mein Github-Repo und meinen Blog-Beitrag - es hat eine ganze Weile gedauert, bis ich das herausgefunden habe.


1
Die Verwendung Ihres Elektronenkesselplatten-SQLites ist in der Tat die einfachere Methode, aber mitnpm install
Bernardo Ramos

1
Beim Ausführen von 'npm run postinstall' wurde die Fehlermeldung "Erstellen der Projekte in dieser Lösung nacheinander. Um die parallele Erstellung zu aktivieren, fügen Sie bitte den Schalter" / m "hinzu."
Chirag

Dies hat meine Haut nicht nur einmal, sondern bisher zweimal gerettet!
John Nesbitt

Weiß jemand, ob die --save sqlite3Option zuverlässig in der ersten Zeile (mit --save-dev electron-builder) markiert werden kann , wo npm installsie nur einmal ausgeführt werden würde?
Phillip

Dies funktioniert bei mir nicht. Ich erhalte Fehler wie "../../nan/nan_object_wrap.h:67:18: Fehler:" Klasse Nan :: Persistent <v8 :: Object> "hat kein Mitglied mit dem Namen" MarkIndependent ". `
Michael

21

Ich würde das native Node-SQLite3-Modul nicht empfehlen. Es muss neu aufgebaut werden, um mit Elektronen arbeiten zu können. Dies ist ein gewaltiger Schmerz - zumindest kann ich es nie zum Laufen bringen und es gibt keine Anweisungen zum Neuerstellen von Modulen unter Windows.

Schauen Sie sich stattdessen das Modul 'sql.js' von kripken an, sqlite3, das zu 100% in JavaScript kompiliert wurde. https://github.com/kripken/sql.js/


3
Elektronendokumente sind ziemlich klar, dass Sie gebündelte native Module neu erstellen müssen, um mit Elektronen arbeiten zu können. Verwenden Sie entweder das Dienstprogramm zur Wiederherstellung von Elektronen, das die meiste Zeit funktioniert, oder setzen Sie die Gyp-Flags manuell: Electron.atom.io/docs/tutorial/using-native-node-modules
Bret

1
Entschuldigung für die langsame Antwort. github.com/electron/electron-rebuild ist ein praktisches Tool zum Wiederherstellen in der Entwicklung. github.com/electron-userland/electron-builder/wiki/… beschreibt eine plattformübergreifende Build-Strategie für Produktions-Builds. Denken Sie jedoch daran, dass Sie nach der Einführung nativer Deps nicht mehr in der Lage sind, Kompilierungen für verschiedene Betriebssysteme durchzuführen. github.com/nodejs/node-gyp#installation verfügt über anständige Dokumente zu den erforderlichen Windows-Compiler-Tools.
Bret

1
Keiner dieser Kommentare ist für diese Antwort relevant!
user3791372

14
Es sollte erwähnt werden, dass sql.js nicht auf dem Dateisystem ausgeführt werden kann. Jedes Mal, wenn Sie die Datenbank ändern müssen, müssen Sie das Ganze auf die Festplatte schreiben. Dies macht es für die meisten Szenarien so gut wie nutzlos.
Mode777

3
sql.js ist eher wie ein Spielzeug, das zum Spaß gemacht ist. Es kann nicht besser sein als NeDB und andere nosql-Datenbanken, da es alle Datenbanken im Speicher speichert. Es gibt also keinen guten Grund, es zu benutzen. Für kleine Datenbanken verwenden Sie nosql wie NeDB, für größere müssen Sie sqlite kompilieren
Daimos

8

Hierbei sind zwei Aspekte zu berücksichtigen:

  1. Einstellung NODE_PATH: Hiermit erfahren die Elektronen, wo sich Ihre Module befinden ( eine ausführliche Erklärung finden Sie in dieser Antwort ).
  2. Kompilieren nativer Module gegen Elektronenköpfe: siehe offizielle Dokumente

Schauen Sie sich die folgenden Fragen an, die dasselbe stellen:


Mein Tipp wäre, Lovefield (von Google) auszuprobieren.


In Nodewebkit muss ich das SQLite kompilieren. Gleiche Regel gilt für das Elektron?
Vedran Maricevic.

@Wexoni AFAIK Jedes Knotenmodul mit nativen Bindungen muss gegen Elektronen-Header kompiliert werden.
Yan Foto

Vergib mir meine Unwissenheit, aber wie ich es verstehe ... gilt die gleiche Regel für Electron und für NW?
Vedran Maricevic.

1
@Wexoni Ich habe nicht mit NW gearbeitet, aber ich weiß, dass sqlite3dies kompiliert werden muss, bevor ich es in Elektronen verwenden kann. Verstehe ich Ihre Frage richtig?
Yan Foto

1
@YannBertrand sie verwenden immer noch eigene Header. Ich nehme an, Sie müssten es immer noch anhand ihrer Header kompilieren.
Yan Foto

7

Ich hatte das gleiche Problem. Versuchte alles und atlast dies funktionierte für mich: -

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

Dadurch wird der Ordner "Electron-v1.3-win32-x64" in. \ Node_modules \ sqlite3 \ lib \ binding \ location erstellt, der von Electron zur Verwendung von sqlite3 verwendet wird.

Starten Sie einfach die Anwendung und Sie können jetzt sqlite3 verwenden.


Es wurde nur ein leerer Ordner erstellt, aber immer noch keine node_sqlite3.nodeDatei darin
Mehdi Dehghani

Das vorgefertigte Elektron wurde in Elektron umbenannt. Weitere Informationen finden Sie unter Electron.atom.io/blog/2016/08/16/npm-install-electron
Jacob Nelson

6

Eine einfachere Lösung:

  1. Installieren Sie den Elektronenaufbau npm i electron-rebuild --save-dev
  2. Starten Sie die Elektronenwiederherstellung ./node_modules/.bin/electron-rebuild(oder .\node_modules\.bin\electron-rebuild.cmdunter Windows).
  3. Gehen Sie zu " node_modules / sqlite3 / lib / binding / " und benennen Sie den Ordner " Electron-v0.36-darwin-x64 " in " node- v47 -darwin-x64 " um.

PS: v47 ist meine Version, achten Sie darauf, die gute zu wählen (in Ihrem Fall v45 )


4
Können Sie den dritten Schritt erklären? Warum umbenennen?
m4heshd

3

Ich stoße auch auf diesen Fehler. So löse ich es: npm install --save-dev electron-rebuild dann: ./node_modules/.bin/electron-rebuild

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

ps: Verwenden Sie während des Wiederaufbaus nicht die npm startLanchierung der Elektronen-App. Andernfalls würde der Wiederherstellungsprozess fehlschlagen.



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

Fügen Sie dann in den Skripten Ihrer package.json die folgende Zeile hinzu:

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

Dann einfach neu installieren, um die Nachinstallation auszulösen:

npm install

Funktioniert für mich einwandfrei in einem komplexen Anwendungsfall, der auch Electron-Builder, Electron-Webpack und Sequelize umfasst.

Es funktioniert im Dev-Modus von Electron-Webpack und im Produktionsmodus für Windows und Linux.


2

Schauen Sie sich hier eine ähnliche Antwort an

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
Wie prepublishsieht das Skript aus?
Victor Ivens

0

Sie können die nativen Module manuell mit Visual Studio erstellen.

  1. Laden Sie Visual Studio 2019 herunter.
  2. Installieren Sie das Paket "Desktop-Entwicklung mit C ++". Wählen Sie auf der Registerkarte Installationsdetails "MSVC v140 - VS 2015 C ++ - Build-Tools (v14.00)" aus.
  3. Laden Sie Electron-Builder in Ihr Projekt herunter.
  4. Erstellen Sie in package.json ein Skript. "scripts": {"postinstall": "install-app-deps"}

  5. Führen Sie dann das Skript aus.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.