¿Cómo usar el módulo sqlite3 con electron?

88

Quiero desarrollar una aplicación de escritorio usando electron que use el paquete sqlite3 instalado a través de npm con el comando

npm install --save sqlite3

pero da el siguiente error en la consola del navegador electron

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

Mi entorno de desarrollo es Windows 8.1 x64 node versión 12.7

mi archivo package.json se ve así:

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

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

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

archivo 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>
manas
fuente

Respuestas:

125

Con mucho, la forma más fácil de usar SQLite con electron es con electron-builder.

Primero, agregue un paso posterior a la instalación en su package.json:

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

y luego instale las dependencias necesarias y compile:

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

electron-builder construirá el módulo nativo para su plataforma, con el nombre correcto para el enlace Electron; y luego puede requirehacerlo en código como de costumbre.

Vea mi repositorio de github y la publicación de blog ; me tomó bastante tiempo resolver esto también.

Steve Melia
fuente
1
Usar su electron-boilerplate-sqlite es de hecho el método más fácil, pero connpm install
Bernardo Ramos
1
cuando ejecuto 'npm run postinstall', aparece este error "Construyendo los proyectos en esta solución uno a la vez. Para habilitar la construcción paralela, agregue el modificador" / m ".
chirag
¡Esto me ha salvado la piel no una, sino dos veces hasta ahora!
John Nesbitt
¿Alguien sabe si la --save sqlite3opción se puede etiquetar de manera confiable en la primera línea (con --save-dev electron-builder), donde npm installsolo se ejecutaría una vez?
Phillip
Esto no me funciona, obtengo errores como `../../nan/nan_object_wrap.h:67:18: error: 'class Nan :: Persistent <v8 :: Object>' no tiene ningún miembro llamado 'MarkIndependent' `
Michael
21

No recomendaría el módulo sqlite3 del nodo nativo. Requiere ser reconstruido para trabajar con electrones. Esto es una gran molestia para hacer: al menos nunca puedo hacer que funcione y no hay instrucciones para reconstruir módulos en Windows.

En su lugar, eche un vistazo al módulo 'sql.js' de kripken, que es sqlite3 que ha sido compilado al 100% en JavaScript. https://github.com/kripken/sql.js/

Joue Bien
fuente
3
Los documentos de Electron son bastante claros en que para usar módulos nativos empaquetados, debe reconstruirlos para trabajar con electron. Utilice la utilidad de reconstrucción de electrones que funciona la mayor parte del tiempo o configure manualmente los indicadores gyp: electron.atom.io/docs/tutorial/using-native-node-modules
Bret
1
Disculpe por la tardanza en responder. github.com/electron/electron-rebuild es una herramienta útil para reconstruir en desarrollo. github.com/electron-userland/electron-builder/wiki/… describe una estrategia de compilación multiplataforma para compilaciones de producción. Pero recuerde, una vez que introduce los departamentos nativos, pierde la capacidad de realizar una compilación cruzada para diferentes sistemas operativos. github.com/nodejs/node-gyp#installation tiene documentos decentes sobre las herramientas necesarias del compilador de Windows.
Bret
1
¡Ninguno de estos comentarios es relevante para esta respuesta!
user3791372
14
Cabe mencionar que sql.js no puede operar en el sistema de archivos. Cada vez que necesite cambiar la base de datos, debe escribir todo en el disco. Haciéndolo prácticamente inútil para la mayoría de los escenarios.
mode777
3
sql.js es más como un juguete, hecho para divertirse. No puede ser mejor que NeDB y otras bases de datos nosql, porque almacena todas las bases de datos en la memoria. Entonces no hay una buena razón para usarlo. Para bases de datos pequeñas, use nosql como NeDB, para más grandes, debe compilar sqlite
Daimos
9

Aquí se deben considerar dos aspectos:

  1. Configuración NODE_PATH: esto le permite a electron saber dónde encontrar sus módulos (consulte esta respuesta para obtener una explicación detallada)
  2. Compilación de módulos nativos contra encabezados de electrones: consulte los documentos oficiales

Y revise las siguientes preguntas, que hacen lo mismo:


Mi consejo sería probar lovefield (de Google).

Yan Foto
fuente
En Nodewebkit, debo compilar sqlite. ¿Se aplica la misma regla para el electrón?
Wexoni
@Wexoni AFAIK cada módulo de nodo con enlaces nativos debe compilarse con encabezados de electrones.
Yan Foto
1
@Wexoni No he trabajado con NW, pero sé que sqlite3hay que compilarlo antes de poder usarlo en electron. ¿Estoy entendiendo tu pregunta correctamente?
Yan Foto
1
@YannBertrand todavía usan sus propios encabezados. Así que supongo que aún necesitarás compilarlo con sus encabezados.
Yan Foto
1
Gracias por tu consejo, lovefield. Realmente es una gran biblioteca.
Mostasim Billah
7

Yo estaba teniendo el mismo problema. Probé todo y al fin esto funcionó para mí: -

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

Esto creará la carpeta "electron-v1.3-win32-x64" en. \ Node_modules \ sqlite3 \ lib \ binding \ location que es utilizada por electron para usar sqlite3.

Simplemente inicie la aplicación y podrá usar sqlite3 ahora.

Rj-s
fuente
Acaba de crear una carpeta vacía, pero aún no hay ningún node_sqlite3.nodearchivo en ella
Mehdi Dehghani
electron-prebuilt ha cambiado de nombre a electron. Para obtener más detalles, consulte electron.atom.io/blog/2016/08/16/npm-install-electron
Jacob Nelson
6

Una solución más sencilla:

  1. Instalar electron-rebuild npm i electron-rebuild --save-dev
  2. Inicie la reconstrucción de electrones ./node_modules/.bin/electron-rebuild(o .\node_modules\.bin\electron-rebuild.cmden Windows)
  3. Ir a " node_modules / sqlite3 / lib / unión / " y cambiar el nombre de la carpeta " electrones v0.36-darwin-64 " a " nódulo- v47 -darwin x 64 "

PD: v47 es mi versión, ten cuidado de elegir la buena (en tu caso v45 )

Fabien Sa
fuente
4
¿Puedes explicar el tercer paso? ¿Por qué renombrar?
m4heshd
3

También encuentro este error. Así es como lo resuelvo: npm install --save-dev electron-rebuild entonces: ./node_modules/.bin/electron-rebuild

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

pd: mientras está en reconstrucción, no use npm startpara lanzar la aplicación electron. De lo contrario, el proceso de reconstrucción fallaría.

Valleygtc
fuente
3

Me funciona en la versión 3 y 4, desafortunadamente NO en la versión 5. Consulte la documentación de sqlite3 para obtener más detalles: https://www.npmjs.com/package/sqlite3#custom-builds-and-electron o ejecute la siguiente línea:npm install sqlite3 --runtime=electron --target=4.0.0 --dist-url=https://atom.io/download/electron

Sailab Rahi
fuente
Ese fue mi problema con sqlite3 y electron8.3.0, y funciona, gracias.
Shayana Keiraved Pahal
3
npm install --save sqlite3
npm install --save-dev electron-rebuild

Luego, en los scripts de su package.json, agregue esta línea:

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

Luego, vuelva a instalar para activar la postinstalación:

npm install

Funciona perfectamente para mí en un caso de uso complejo que también involucra el generador de electrones, el paquete web de electrones y la secuenciación.

Funciona en modo dev de electron-webpack y en modo de producción tanto para Windows como para Linux.

nicolas-van
fuente
2

Eche un vistazo a una respuesta similar aquí.

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
smkndblvr
fuente
3
¿cómo se prepublishve el guión ?
Victor Ivens
0

Puede construir manualmente los módulos nativos usando Visual Studio.

  1. Descarga Visual Studio 2019.
  2. Instale el paquete "desarrollo de escritorio con c ++". En la pestaña de detalles de instalación, seleccione "MSVC v140 - VS 2015 C ++ build tools (v14.00)"
  3. Descargue electron-builder en su proyecto.
  4. En package.json cree un script. "scripts": {"postinstall": "install-app-deps"}

  5. luego ejecute el script.

Joel
fuente