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>

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.


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/


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).


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.


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 )


4
Czy możesz wyjaśnić trzeci krok? Dlaczego zmienić nazwę?
m4heshd



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.


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

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.