Como usar o módulo sqlite3 com elétron?

88

Quero desenvolver um aplicativo desktop usando electron que usa o pacote sqlite3 instalado via npm com o comando

npm install --save sqlite3

mas dá o seguinte erro no console do navegador eletrônico

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

Meu ambiente de desenvolvimento é o Windows 8.1 x64 node versão 12.7

meu arquivo package.json tem a seguinte aparência:

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

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

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

arquivo 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
fonte

Respostas:

125

De longe, a maneira mais fácil de usar SQLite com elétron é com electron-builder.

Primeiro, adicione uma etapa de pós-instalação em seu package.json:

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

e, em seguida, instale as dependências necessárias e compile:

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

o construtor de elétrons construirá o módulo nativo para sua plataforma, com o nome correto para a ligação de elétrons; e você pode então requirefazê - lo em código normalmente.

Veja meu repositório github e postagem no blog - também demorei um pouco para descobrir isso.

Steve Melia
fonte
1
Usar seu electron-boilerplate-sqlite é realmente o método mais fácil, mas comnpm install
Bernardo Ramos
1
ao executar 'npm run postinstall', recebo este erro "Compilando os projetos nesta solução, um de cada vez. Para habilitar a compilação paralela, adicione a opção" / m "."
chirag de
Isso salvou minha pele não uma, mas duas vezes até agora!
John Nesbitt
Alguém sabe se a --save sqlite3opção pode ser etiquetada de forma confiável na primeira linha (com --save-dev electron-builder), onde npm installseria executada apenas uma vez?
Phillip de
Isso não funciona para mim, recebo erros como `../../nan/nan_object_wrap.h:67:18: error: 'class Nan :: Persistent <v8 :: Object>' não tem membro chamado 'MarkIndependent' `
Michael
21

Eu não recomendaria o módulo sqlite3 de nó nativo. Ele requer uma reconstrução para funcionar com o elétron. Isso é uma dor enorme de se fazer - pelo menos eu nunca consigo fazer funcionar e não há instruções para reconstruir módulos no windows.

Em vez disso, dê uma olhada no módulo 'sql.js' do kripken, que é sqlite3 que foi compilado 100% em JavaScript. https://github.com/kripken/sql.js/

Joue Bien
fonte
3
Os documentos do Electron são bem claros de que, para usar módulos nativos agrupados, é necessário reconstruí-los para trabalhar com o elétron. Use o utilitário de reconstrução de elétrons que funciona na maioria das vezes ou defina manualmente os sinalizadores gyp: electron.atom.io/docs/tutorial/using-native-node-modules
Bret
1
Desculpe pela resposta demorada. github.com/electron/electron-rebuild é uma ferramenta útil para reconstrução em desenvolvimento. github.com/electron-userland/electron-builder/wiki/… descreve uma estratégia de construção multiplataforma para construções de produção. Mas lembre-se, depois de introduzir dependências nativas, você perde a capacidade de compilar para diferentes sistemas operacionais. github.com/nodejs/node-gyp#installation tem documentos decentes sobre as ferramentas necessárias do compilador do Windows.
Bret
1
nenhum desses comentários é relevante para esta resposta!
user3791372
14
Deve ser mencionado que sql.js não pode operar no sistema de arquivos. Toda vez que você precisar alterar o banco de dados, deverá gravar tudo no disco. Tornando-o praticamente inútil para a maioria dos cenários.
mode777
3
sql.js é mais como um brinquedo, feito para se divertir. Não pode ser melhor do que NeDB e outros bancos de dados nosql, porque ele armazena todos os bancos de dados na memória. Portanto, não há um bom motivo para usá-lo. Para banco de dados pequeno, use nosql como NeDB, para maiores você deve compilar sqlite
Daimos
9

Dois aspectos devem ser considerados aqui:

  1. Configuração NODE_PATH: permite que o elétron saiba onde encontrar seus módulos (veja esta resposta para uma explicação completa)
  2. Compilando módulos nativos contra cabeçalhos de elétrons: veja os documentos oficiais

E verifique as seguintes perguntas, que fazem a mesma coisa:


Minha dica seria dar uma chance ao lovefield (do Google).

Yan Foto
fonte
No Nodewebkit, devo compilar o sqlite. A mesma regra se aplica ao elétron?
Wexoni
@Wexoni AFAIK cada módulo de nó com ligações nativas deve ser compilado contra cabeçalhos de elétrons.
Yan Foto
1
@Wexoni Não trabalhei com o NW, mas sei que sqlite3deve ser compilado antes de poder usar no elétron. Estou entendendo sua pergunta corretamente?
Yan Foto
1
@YannBertrand eles ainda usam cabeçalhos próprios. Então, suponho que você ainda precise compilá-lo com seus cabeçalhos.
Yan Foto
1
Obrigado pela sua dica, campo amoroso. É realmente uma ótima biblioteca.
Mostasim Billah
7

Eu estava tendo o mesmo problema. Tentei de tudo e pelo menos funcionou para mim: -

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

Isso criará a pasta "electron-v1.3-win32-x64" em. \ Node_modules \ sqlite3 \ lib \ binding \ location que é usado pelo elétron para usar sqlite3.

Basta iniciar o aplicativo e você poderá usar o sqlite3 agora.

Rj-s
fonte
Ele acabou de criar uma pasta vazia, mas ainda não há nenhum node_sqlite3.nodearquivo nela
Mehdi Dehghani
elétron pré-construído foi renomeado para elétron. Para obter mais detalhes, consulte electron.atom.io/blog/2016/08/16/npm-install-electron
Jacob Nelson
6

Uma solução mais simples:

  1. Instale a reconstrução de elétrons npm i electron-rebuild --save-dev
  2. Inicie a reconstrução de elétrons ./node_modules/.bin/electron-rebuild(ou .\node_modules\.bin\electron-rebuild.cmdnas janelas)
  3. Vá para " node_modules / sqlite3 / lib / binding / " e renomeie a pasta " electron-v0.36-darwin-x64 " para " node- v47 -darwin-x64 "

PS: v47 é a minha versão, tenha cuidado ao escolher a boa (no seu caso v45 )

Fabien Sá
fonte
4
Você pode explicar a terceira etapa? Por que renomear?
m4heshd
3

Eu também encontro esse erro. Aqui está como eu resolvo: npm install --save-dev electron-rebuild então: ./node_modules/.bin/electron-rebuild

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

ps: Enquanto estiver sendo reconstruído, não use npm startpara danificar o aplicativo de elétrons. Caso contrário, o processo de reconstrução falhará.

Valleygtc
fonte
3

Funciona para mim nas versões 3 e 4, infelizmente NÃO na versão 5. Consulte a documentação sqlite3 para obter detalhes: https://www.npmjs.com/package/sqlite3#custom-builds-and-electron ou execute a seguinte linha:npm install sqlite3 --runtime=electron --target=4.0.0 --dist-url=https://atom.io/download/electron

Sailab Rahi
fonte
Esse era o meu problema com sqlite3 e electron8.3.0, e funciona, obrigado.
Shayana Keiraved Pahal
3
npm install --save sqlite3
npm install --save-dev electron-rebuild

Então, nos scripts do seu package.json, adicione esta linha:

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

Em seguida, basta reinstalar para acionar a pós-instalação:

npm install

Funciona perfeitamente para mim em um caso de uso complexo envolvendo também construtor de elétrons, pacote de web-elétrons e sequenciamento.

Ele funciona no modo dev do electron-webpack e no modo de produção para Windows e Linux.

nicolas-van
fonte
2

Dê uma olhada em uma resposta semelhante aqui

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
fonte
3
como é o script prepublish?
Victor Ivens
0

Você pode construir manualmente os módulos nativos usando o Visual Studio.

  1. Baixe o Visual Studio 2019.
  2. Instale o pacote "desenvolvimento de desktop com c ++". Na guia de detalhes da instalação, selecione "MSVC v140 - VS 2015 C ++ build tools (v14.00)"
  3. Baixe o construtor de elétrons em seu projeto.
  4. Em package.json crie um script. "scripts": {"postinstall": "install-app-deps"}

  5. em seguida, execute o script.

Joel
fonte