Як використовувати модуль sqlite3 з електроном?


88

Я хочу розробити настільний додаток, використовуючи електрон, який використовує пакет sqlite3, встановлений через npm за допомогою команди

npm install --save sqlite3

але це дає таку помилку в консолі електронного браузера

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

Моє середовище розробки - вузол Windows 8.1 x64 версії 12.7

мій файл package.json виглядає так:

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

файл 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;
    });
});

файл 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();

файл 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>

Відповіді:


125

Безумовно, найпростіший спосіб використання SQLite з електроном - це electron-builder.

Спочатку додайте крок після встановлення у пакет package.json:

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

а потім встановіть необхідні залежності та побудуйте:

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

electron-builder створить власний модуль для вашої платформи з правильною назвою для прив'язки Electron; і ви можете потім requireце зробити в коді, як зазвичай.

Перегляньте моє репозиторій github та допис у блозі - мені теж знадобився досить довгий час, щоб зрозуміти це.


1
Використання вашого електронного шаблону-sqlite справді є більш простим методом, алеnpm install
Бернардо Рамос

1
при запуску 'npm run postinstall', я отримав цю помилку: "Створення проектів у цьому рішенні по одному. Щоб увімкнути паралельну збірку, додайте перемикач" / m "."
chirag

Це врятувало мою шкуру не раз, а двічі дотепер!
Джон Несбітт,

Хтось знає, чи --save sqlite3можна опцію надійно позначити на першому рядку (з --save-dev electron-builder), де npm installбуде запущено лише один раз?
Філіп

Це не працює у мене, я отримую помилки типу `../../nan/nan_object_wrap.h:67:18: error: 'class Nan :: Persistent <v8 :: Object>' не має учасника з ім'ям 'MarkIndependent' `
Майкл

21

Я б не рекомендував власний вузол sqlite3. Це вимагає перебудови для роботи з електроном. Це величезна проблема - принаймні, я ніколи не можу змусити її працювати, а їхні вказівки щодо відновлення модулів на вікнах відсутні.

Натомість подивіться на модуль kripken 'sql.js', який є sqlite3, який був скомпільований на 100% у JavaScript. https://github.com/kripken/sql.js/


3
Електронні документи цілком зрозуміло, що для того, щоб використовувати вбудовані вбудовані модулі, вам потрібно їх перебудувати, щоб працювати з електроном. Або скористайтеся утилітою відновлення електронів, яка працює більшу частину часу, або встановіть вручну прапори gyp: electron.atom.io/docs/tutorial/using-native-node-modules
Брет

1
Вибачте за повільну відповідь. github.com/electron/electron-rebuild - це зручний інструмент для відновлення в розробці. github.com/electron-userland/electron-builder/wiki/… описує мультиплатформенну стратегію побудови виробничих збірок. Але пам’ятайте, коли ви вводите рідні депи, ви втрачаєте можливість перехресного компілювання для різних ОС. github.com/nodejs/node-gyp#installation має пристойні документи щодо необхідних інструментів компілятора Windows.
Брет

1
жоден із цих коментарів не має відношення до цієї відповіді!
user3791372

14
Слід зазначити, що sql.js не може працювати з файловою системою. Щоразу, коли вам потрібно змінити базу даних, ви повинні записати все це на диск. Робить це майже марним для більшості сценаріїв.
mode777

3
sql.js це більше схоже на іграшку, створену для розваги. Це не може бути краще, ніж NeDB та інші бази даних nosql, оскільки в ній зберігається вся база даних у пам'яті. Тому немає жодної вагомої причини використовувати його. Для невеликої бази даних використовуйте nosql, як NeDB, для більшої потрібно скомпілювати sqlite
Daimos,

9

Тут слід розглянути два аспекти:

  1. Параметр NODE_PATH: це дозволяє електрону знати, де знайти ваші модулі (див. Цю відповідь для детального пояснення)
  2. Компіляція власних модулів проти електронних заголовків: див. Офіційні документи

І перевірте наступні запитання, які задають одне і те ж:


Моя порада повинен був би дати Lovefield (від Google) спробувати.


У Nodewebkit я повинен скомпілювати sqlite. Те саме правило застосовується до електрона?
Вексоні,

@Wexoni AFAIK кожен модуль вузла з власними прив'язками повинен бути скомпільований проти електронних заголовків.
Yan Foto

1
@Wexoni Я не працював із NW, але я знаю, що це sqlite3потрібно скомпілювати, перш ніж мати можливість використовувати його в електроні. Я правильно розумію ваше запитання?
Yan Foto

1
@YannBertrand вони все ще використовують власні заголовки. Тож я гадаю, вам все одно доведеться компілювати його за їх заголовками.
Ян Фото

1
Дякуємо за підказку lovefield. Це справді чудова бібліотека.
Мостасім Білла

7

У мене була така сама проблема. Все пробував і атласт це працювало у мене: -

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

Це створить папку "electron-v1.3-win32-x64" у. \ Node_modules \ sqlite3 \ lib \ binding \ розташування, яке використовується електроном для використання sqlite3.

Просто запустіть програму, і ви зможете використовувати sqlite3 зараз.


Він щойно створив порожню папку, але досі node_sqlite3.nodeв ній немає файлу
Мехді Деггані

попередньо побудований електрон було перейменовано на електрон. Детальніше див. Electron.atom.io/blog/2016/08/16/npm-install-electron
Jacob Nelson

6

Більш просте рішення:

  1. Встановіть електронну перебудову npm i electron-rebuild --save-dev
  2. Запустити електронну перебудову ./node_modules/.bin/electron-rebuild(або .\node_modules\.bin\electron-rebuild.cmdна вікнах)
  3. Перейти до " node_modules / sqlite3 / Бібліотека / зв'язування / " і перейменуйте папку " електрон-v0.36-Darwin-x64 " до " node- V47 -darwin-64 "

PS: v47 - це моя версія, будьте обережні, щоб вибрати хорошу (у вашому випадку v45 )


4
Ви можете пояснити третій крок? Навіщо перейменовувати?
m4heshd

3

Я також стикаюся з цією помилкою. Ось як я це вирішую: npm install --save-dev electron-rebuild тоді: ./node_modules/.bin/electron-rebuild

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

ps: Поки це відбудовується, не використовуйте npm startдля запуску електронної програми. Інакше процес відновлення зазнав би невдачі.


3

Для мене це працює у версіях 3 та 4, на жаль, НЕ версії 5. Детальніше див. Документацію на sqlite3: https://www.npmjs.com/package/sqlite3#custom-builds-and-electron або іншим чином запустіть наступний рядок:npm install sqlite3 --runtime=electron --target=4.0.0 --dist-url=https://atom.io/download/electron


Це була моя проблема з sqlite3 та electron8.3.0, і це працює, дякую.
Шаяна Кіравед Пахал

3
npm install --save sqlite3
npm install --save-dev electron-rebuild

Потім у скриптах вашого package.json додайте цей рядок:

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

Потім просто перевстановіть, щоб запустити післявстановлення:

npm install

Для мене працює бездоганно у складному випадку використання, який також включає конструктор електронів, електронний веб-пакет та секвеліз.

Він працює в режимі розробника electron-webpack та у виробничому режимі як для Windows, так і для Linux.


2

Подивіться на подібну відповідь тут

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
як prepublishвиглядає сценарій ?
Віктор Івенс

0

Ви можете вручну створити власні модулі за допомогою Visual Studio.

  1. Завантажте Visual Studio 2019.
  2. Встановіть пакет "Розвиток робочого столу з C ++". На вкладці подробиці встановлення виберіть "MSVC v140 - VS 2015 C ++ build tools (v14.00)"
  3. Завантажте конструктор електронів у свій проект.
  4. У package.json створіть сценарій. "scripts": {"postinstall": "install-app-deps"}

  5. потім запустіть сценарій.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.