Comment utiliser le module sqlite3 avec électron?


88

Je souhaite développer une application de bureau en utilisant electron qui utilise le package sqlite3 installé via npm avec la commande

npm install --save sqlite3

mais cela donne l'erreur suivante dans la console du navigateur électronique

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

Mon environnement de développement est Windows 8.1 x64 node version 12.7

mon fichier package.json ressemble à ceci:

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

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

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

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

Réponses:


125

De loin, le moyen le plus simple d'utiliser SQLite avec électron est avec electron-builder.

Tout d'abord, ajoutez une étape de post-installation dans votre package.json:

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

puis installez les dépendances nécessaires et construisez:

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

electron-builder construira le module natif pour votre plate-forme, avec le nom correct pour la liaison Electron; et vous pouvez ensuite requirele dans le code comme d'habitude.

Voir mon dépôt github et mon article de blog - il m'a fallu un certain temps pour comprendre cela aussi.


1
Utiliser votre électron-passe-partout-sqlite est en effet la méthode la plus simple, mais avecnpm install
Bernardo Ramos

1
lors de l'exécution de 'npm run postinstall', j'ai obtenu cette erreur "Construire les projets dans cette solution un à la fois. Pour activer la construction parallèle, veuillez ajouter le commutateur" / m "."
chirag le

Cela a sauvé ma peau non pas une fois, mais deux fois jusqu'à présent!
John Nesbitt le

Est-ce que quelqu'un sait si l' --save sqlite3option peut être étiquetée de manière fiable sur la première ligne (avec --save-dev electron-builder), où npm installne serait exécutée qu'une seule fois?
Phillip

Cela ne fonctionne pas pour moi, j'obtiens des erreurs comme `../../nan/nan_object_wrap.h:67:18: erreur: 'class Nan :: Persistent <v8 :: Object>' n'a aucun membre nommé 'MarkIndependent' `
Michael

21

Je ne recommanderais pas le module sqlite3 du nœud natif. Il faut être reconstruit pour travailler avec l'électron. C'est une douleur énorme à faire - Au moins, je ne peux jamais le faire fonctionner et leurs instructions ne sont pas pour reconstruire des modules sur Windows.

Jetez plutôt un œil au module 'sql.js' de kripken qui est sqlite3 qui a été compilé à 100% en JavaScript. https://github.com/kripken/sql.js/


3
Les documents Electron indiquent assez clairement que pour utiliser des modules natifs groupés, vous devez les reconstruire afin de travailler avec electron. Utilisez l'utilitaire de reconstruction d'électrons qui fonctionne la plupart du temps ou définissez manuellement les indicateurs gyp: electron.atom.io/docs/tutorial/using-native-node-modules
Bret

1
Désolé pour la lenteur de la réponse. github.com/electron/electron-rebuild est un outil pratique pour la reconstruction en cours de développement. github.com/electron-userland/electron-builder/wiki/… décrit une stratégie de construction multi-plateforme pour les versions de production. N'oubliez pas qu'une fois que vous avez introduit deps natifs, vous perdez la possibilité de faire une compilation croisée pour différents systèmes d'exploitation. github.com/nodejs/node-gyp#installation a des documents décents sur les outils de compilation Windows nécessaires.
Bret

1
aucun de ces commentaires n'est pertinent pour cette réponse!
user3791372

14
Il convient de mentionner que sql.js ne peut pas fonctionner sur le système de fichiers. Chaque fois que vous devez modifier la base de données, vous devez tout écrire sur le disque. Le rendant pratiquement inutile pour la plupart des scénarios.
mode777

3
sql.js ressemble plus à un jouet, fait pour le plaisir. Il ne peut pas être meilleur que NeDB et d'autres bases de données nosql, car il stocke toutes les bases de données en mémoire. Il n'y a donc aucune bonne raison de l'utiliser. Pour les petites bases de données, utilisez nosql comme NeDB, pour les plus grandes, vous devez compiler sqlite
Daimos

9

Deux aspects sont à considérer ici:

  1. Réglage NODE_PATH: cela permet à electron de savoir où trouver vos modules cette réponse pour une explication approfondie)
  2. Compilation de modules natifs contre des en-têtes d'électrons: voir la documentation officielle

Et vérifiez les questions suivantes, qui posent la même chose:


Mon conseil serait d' essayer lovefield (par Google).


Dans Nodewebkit, je dois compiler le sqlite. La même règle s'applique à l'électron?
Wexoni

@Wexoni AFAIK chaque module de nœud avec des liaisons natives doit être compilé avec des en-têtes d'électrons.
Yan Foto

1
@Wexoni Je n'ai pas travaillé avec NW, mais je sais que cela sqlite3doit être compilé avant de pouvoir l'utiliser en électron. Ai-je bien compris votre question?
Yan Foto

1
@YannBertrand ils utilisent toujours leurs propres en-têtes. Donc, je suppose que vous devrez toujours le compiler par rapport à leurs en-têtes.
Yan Foto

1
Merci pour votre astuce lovefield. C'est vraiment une excellente bibliothèque.
Mostasim Billah

7

J'avais le même problème. J'ai tout essayé et enfin cela a fonctionné pour moi: -

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

Cela créera le dossier "electron-v1.3-win32-x64" dans. \ Node_modules \ sqlite3 \ lib \ binding \ location qui est utilisé par electron pour utiliser sqlite3.

Démarrez simplement l'application et vous pourrez utiliser sqlite3 maintenant.


Il vient de créer un dossier vide, mais toujours aucun node_sqlite3.nodefichier dedans
Mehdi Dehghani

électron-prebuilt a été renommé électron. Pour plus de détails, voir electron.atom.io/blog/2016/08/16/npm-install-electron
Jacob Nelson

6

Une solution plus simple:

  1. Installez la reconstruction d'électrons npm i electron-rebuild --save-dev
  2. Lancer la reconstruction électronique ./node_modules/.bin/electron-rebuild(ou .\node_modules\.bin\electron-rebuild.cmdsur Windows)
  3. Allez dans " node_modules / sqlite3 / lib / binding / " et renommez le dossier " electron-v0.36-darwin-x64 " en " node- v47 -darwin-x64 "

PS: la v47 est ma version, attention à bien choisir la bonne (dans votre cas v45 )


4
Pouvez-vous expliquer la troisième étape? Pourquoi renommer?
m4heshd



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

Ensuite, dans les scripts de votre package.json, ajoutez cette ligne:

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

Ensuite, réinstallez simplement pour déclencher la post-installation:

npm install

Fonctionne parfaitement pour moi dans un cas d'utilisation complexe impliquant également électron-builder, électron-webpack et sequelize.

Il fonctionne en mode développement d'electron-webpack et en mode production pour Windows et Linux.


2

Jetez un œil à une réponse similaire ici

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
à quoi prepublishressemble le script ?
Victor Ivens

0

Vous pouvez créer manuellement les modules natifs à l'aide de Visual Studio.

  1. Téléchargez Visual Studio 2019.
  2. Installez le package "développement de bureau avec C ++". Dans l'onglet des détails de l'installation, sélectionnez «MSVC v140 - VS 2015 C ++ build tools (v14.00)»
  3. Téléchargez electron-builder dans votre projet.
  4. Dans package.json, créez un script. "scripts": {"postinstall": "install-app-deps"}

  5. puis exécutez le script.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.