Jak korzystać z modułu sqlite3 z elektronem?

88

Chcę opracować aplikację desktopową przy użyciu electron, która używa pakietu sqlite3 zainstalowanego przez npm za pomocą polecenia

npm install --save sqlite3

ale daje następujący błąd w konsoli przeglądarki electron

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

Moje środowisko programistyczne to Windows 8.1 x64 node w wersji 12.7

mój plik package.json wygląda następująco:

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

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

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

plik 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
źródło

Odpowiedzi:

125

Zdecydowanie najłatwiejszym sposobem użycia SQLite z electronem jest electron-builder.

Najpierw dodaj krok poinstalacyjny do pliku package.json:

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

a następnie zainstaluj niezbędne zależności i skompiluj:

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

Electronic-builder zbuduje natywny moduł dla Twojej platformy, z poprawną nazwą dla powiązania Electron; i możesz requireto normalnie w kodzie.

Zobacz moje repozytorium na githubie i post na blogu - zajęło mi to również trochę czasu.

Steve Melia
źródło
1
Używanie twojego elektronicznego-boilerplate-sqlite jest rzeczywiście prostszą metodą, ale znpm install
Bernardo Ramosem,
1
po uruchomieniu „npm run postinstall” pojawia się błąd „Tworzenie projektów w tym rozwiązaniu pojedynczo. Aby włączyć kompilację równoległą, dodaj przełącznik„ / m ””.
chirag
To uratowało moją skórę nie raz, ale jak dotąd dwukrotnie!
John Nesbitt
Czy ktoś wie, czy --save sqlite3opcję można niezawodnie oznaczyć w pierwszej linii (z --save-dev electron-builder), gdzie npm installbyłaby uruchomiona tylko raz?
Phillip
To nie działa dla mnie, pojawiają się błędy, takie jak `../../nan/nan_object_wrap.h:67:18: error: 'class Nan :: Persistent <v8 :: Object>' nie ma elementu członkowskiego o nazwie 'MarkIndependent' `
Michael
21

Nie polecam natywnego modułu sqlite3 węzła. Wymaga przebudowy do pracy z elektronem. To ogromny problem - przynajmniej nigdy nie mogę go uruchomić, a ich brak instrukcji dotyczących przebudowy modułów w systemie Windows.

Zamiast tego spójrz na moduł 'sql.js' kripkena, który jest sqlite3, który został skompilowany w 100% w JavaScript. https://github.com/kripken/sql.js/

Joue Bien
źródło
3
Dokumentacja Electron jest całkiem jasna, że ​​aby użyć dołączonych modułów natywnych, musisz je przebudować, aby pracować z electron. Albo użyj narzędzia do przebudowy elektronów, które działa przez większość czasu, lub ręcznie ustaw flagi gyp: electron.atom.io/docs/tutorial/using-native-node-modules
Bret,
1
Przepraszam za powolną odpowiedź. github.com/electron/electron-rebuild to poręczne narzędzie do przebudowy w fazie rozwoju. github.com/electron-userland/electron-builder/wiki/… opisuje wieloplatformową strategię kompilacji dla kompilacji produkcyjnych. Pamiętaj jednak, że po wprowadzeniu natywnych deps tracisz możliwość kompilacji krzyżowej dla różnych systemów operacyjnych. github.com/nodejs/node-gyp#installation ma przyzwoitą dokumentację na temat niezbędnych narzędzi do kompilacji systemu Windows.
Bret
1
żaden z tych komentarzy nie odnosi się do tej odpowiedzi!
user3791372
14
Należy wspomnieć, że sql.js nie może działać na systemie plików. Za każdym razem, gdy musisz zmienić bazę danych, musisz zapisać całość na dysku. W większości przypadków jest to praktycznie bezużyteczne.
mode777
3
sql.js to bardziej zabawka, stworzona dla zabawy. Nie może być lepszy niż NeDB i inne bazy danych nosql, ponieważ przechowuje całą bazę danych w pamięci. Nie ma więc powodu, aby go używać. Dla małej bazy danych użyj nosql jak NeDB, dla większych musisz skompilować sqlite
Daimos
9

Należy tutaj wziąć pod uwagę dwa aspekty:

  1. Ustawienie NODE_PATH: to pozwala elektronowi wiedzieć, gdzie znaleźć twoje moduły (zobacz tę odpowiedź, aby uzyskać szczegółowe wyjaśnienie)
  2. Kompilowanie modułów natywnych z nagłówkami elektronów: zobacz oficjalne dokumenty

I sprawdź następujące pytania, które zadają to samo:


Moja wskazówka to wypróbowanie Lovefield (od Google).

Yan Foto
źródło
W Nodewebkit muszę skompilować sqlite. Ta sama zasada dotyczy elektronu?
Wexoni
@Wexoni AFAIK każdy moduł węzła z natywnymi powiązaniami musi być skompilowany z nagłówkami elektronów.
Yan Zdjęcie
1
@Wexoni Nie pracowałem z NW, ale wiem, że sqlite3trzeba to skompilować, zanim będę mógł użyć go w elektronie. Czy dobrze rozumiem twoje pytanie?
Yan Zdjęcie
1
@YannBertrand nadal używają własnych nagłówków. Więc przypuszczam, że nadal będziesz musiał skompilować to z ich nagłówkami.
Yan Zdjęcie
1
Dzięki za twoją wskazówkę lovefield. To naprawdę świetna biblioteka.
Mostasim Billah
7

Miałem ten sam problem. Wypróbowałem wszystko i przynajmniej to zadziałało: -

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

Spowoduje to utworzenie folderu „electron-v1.3-win32-x64” w. \ Node_modules \ sqlite3 \ lib \ binding \ location, który jest używany przez electron do używania sqlite3.

Po prostu uruchom aplikację i będziesz mógł już korzystać z sqlite3.

Rj-s
źródło
Właśnie utworzył pusty folder, ale nadal nie ma node_sqlite3.nodew nim pliku
Mehdi Dehghani
wstępnie zbudowany elektron został przemianowany na elektron. Więcej szczegółów można znaleźć na stronie electron.atom.io/blog/2016/08/16/npm-install-electron
Jacob Nelson.
6

Prostsze rozwiązanie:

  1. Zainstaluj przebudowę elektronu npm i electron-rebuild --save-dev
  2. Uruchom przebudowę elektronu ./node_modules/.bin/electron-rebuild(lub .\node_modules\.bin\electron-rebuild.cmdw systemie Windows)
  3. Przejdź do „ node_modules / sqlite3 / lib / binding / ” i zmień nazwę folderu „ electron-v0.36-darwin-x64 ” na „ node- v47 -darwin-x64

PS: v47 to moja wersja, uważaj, aby wybrać dobrą (w twoim przypadku v45 )

Fabien Sa
źródło
4
Czy możesz wyjaśnić trzeci krok? Dlaczego zmienić nazwę?
m4heshd
3

Ja też napotykam ten błąd. Oto jak to rozwiązać: npm install --save-dev electron-rebuild wtedy: ./node_modules/.bin/electron-rebuild

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

ps: Podczas przebudowy nie używaj npm startdo lanchowania aplikacji electron. W przeciwnym razie proces odbudowy nie powiedzie się.

valleygtc
źródło
3

Działa dla mnie w wersji 3 i 4, niestety NIE w wersji 5. Szczegółowe informacje można znaleźć w dokumentacji sqlite3: https://www.npmjs.com/package/sqlite3#custom-builds-and-electron lub w inny sposób uruchomić następującą linię:npm install sqlite3 --runtime=electron --target=4.0.0 --dist-url=https://atom.io/download/electron

Sailab Rahi
źródło
To był mój problem z sqlite3 i electron8.3.0 i działa, dzięki.
Shayana Keiraved Pahal
3
npm install --save sqlite3
npm install --save-dev electron-rebuild

Następnie w skryptach pliku package.json dodaj tę linię:

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

Następnie po prostu zainstaluj ponownie, aby uruchomić po instalacji:

npm install

Działa bezbłędnie dla mnie w złożonym przypadku użycia również obejmującym tworzenie elektronów, paczkę elektronów i sequelize.

Działa w trybie deweloperskim electron-webpack oraz w trybie produkcyjnym dla systemów Windows i Linux.

nicolas-van
źródło
2

Spójrz na podobną odpowiedź tutaj

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
źródło
3
jak prepublishwygląda skrypt ?
Victor Ivens,
0

Możesz ręcznie tworzyć natywne moduły za pomocą programu Visual Studio.

  1. Pobierz program Visual Studio 2019.
  2. Zainstaluj pakiet „programowanie pulpitu w języku C ++”. Na karcie szczegółów instalacji wybierz „MSVC v140 - VS 2015 C ++ build tools (v14.00)”
  3. Pobierz narzędzie do tworzenia elektronów w swoim projekcie.
  4. W package.json utwórz skrypt. "scripts": {"postinstall": "install-app-deps"}

  5. następnie uruchom skrypt.

Joel
źródło