Как использовать модуль 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 node версии 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

electronic-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

Я бы не рекомендовал собственный модуль node sqlite3. Требуется перестройка для работы с электроном. Это огромная боль - по крайней мере, я никогда не смогу заставить его работать, и у них нет инструкций по восстановлению модулей в Windows.

Вместо этого взгляните на модуль kripken sql.js, который представляет собой sqlite3, который был скомпилирован на 100% в JavaScript. https://github.com/kripken/sql.js/

Джуэ Бьен
источник
3
В документации Electron довольно ясно сказано, что для использования встроенных собственных модулей вам необходимо перестроить их для работы с электроном. Либо используйте утилиту electronics-rebuild, которая работает большую часть времени, либо вручную установите флаги gyp: electronics.atom.io/docs/tutorial/using-native-node-modules
Bret
1
Извините за медленный ответ. github.com/electron/electron-rebuild - удобный инструмент для восстановления в процессе разработки. github.com/electron-userland/electron-builder/wiki/… описывает многоплатформенную стратегию сборки для производственных сборок. Но помните, как только вы вводите собственные deps, вы теряете возможность кросс-компиляции для разных ОС. На github.com/nodejs/node-gyp#installation есть достойная документация по необходимым инструментам компилятора Windows.
Bret
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
@Wexoni AFAIK каждый модуль узла с собственными привязками должен быть скомпилирован с электронными заголовками.
Ян Фото
1
@Wexoni Я не работал с NW, но знаю, что его sqlite3нужно скомпилировать, прежде чем можно будет использовать его в электронном виде. Правильно ли я понял ваш вопрос?
Ян Фото
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

Это создаст папку «electronics-v1.3-win32-x64» в. \ Node_modules \ sqlite3 \ lib \ binding \ location, которая используется электроном для использования sqlite3.

Просто запустите приложение, и теперь вы сможете использовать sqlite3.

Rj-s
источник
Он просто создал пустую папку, но по-прежнему node_sqlite3.nodeв ней нет файла
Мехди Дехгани
electronic-prebuilt был переименован в electronic. Для получения дополнительной информации см. Electron.atom.io/blog/2016/08/16/npm-install-electron
Джейкоб Нельсон
6

Более простое решение:

  1. Установить электронное восстановление npm i electron-rebuild --save-dev
  2. Запускаем электронное восстановление ./node_modules/.bin/electron-rebuild(или .\node_modules\.bin\electron-rebuild.cmdна windows)
  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для запуска электронного приложения. В противном случае процесс восстановления не удастся.

Valleygtc
источник
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 и electronics8.3.0, и она работает, спасибо.
Шаяна Кейравед Пахал
3
npm install --save sqlite3
npm install --save-dev electron-rebuild

Затем в скриптах вашего package.json добавьте эту строку:

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

Затем просто переустановите, чтобы запустить пост-установку:

npm install

У меня работает безупречно в сложном сценарии использования, в котором также задействован электронный сборщик, электронный веб-пакет и продолжение.

Он работает в режиме разработки electronic-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
smkndblvr
источник
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. затем запустите сценарий.

Джоэл
источник