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.