Bagaimana cara menggunakan modul sqlite3 dengan elektron?


91

Saya ingin mengembangkan aplikasi desktop menggunakan electron yang menggunakan paket sqlite3 yang diinstal melalui npm dengan perintah

npm install --save sqlite3

tetapi memberikan kesalahan berikut di konsol browser elektron

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

Lingkungan pengembangan saya adalah windows 8.1 x64 node versi 12.7

file package.json saya terlihat seperti ini:

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

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

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

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

Jawaban:


126

Sejauh ini, cara termudah untuk menggunakan SQLite dengan elektron adalah dengan electron-builder.

Pertama, tambahkan langkah postinstall di package.json Anda:

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

lalu instal dependensi yang diperlukan dan buat:

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

electron-builder akan membangun modul asli untuk platform Anda, dengan nama yang benar untuk pengikatan Elektron; dan Anda kemudian bisa requiredalam kode seperti biasa.

Lihat repo github dan postingan blog saya - butuh waktu cukup lama untuk mengetahuinya juga.


1
Menggunakan electron-boilerplate-sqlite memang metode yang lebih mudah, tetapi dengannpm install
Bernardo Ramos

1
ketika menjalankan 'npm run postinstall', saya mendapat kesalahan ini "Membangun proyek dalam solusi ini satu per satu. Untuk mengaktifkan pembangunan paralel, tambahkan sakelar" / m "."
chirag

Ini telah menyelamatkan kulit saya tidak hanya sekali, tetapi dua kali sejauh ini!
John Nesbitt

Adakah yang tahu apakah --save sqlite3opsi dapat diberi tag secara andal ke baris pertama (dengan --save-dev electron-builder), di mana npm installhanya akan dijalankan sekali?
Phillip

Ini tidak berhasil untuk saya, saya mendapatkan kesalahan seperti `../../nan/nan_object_wrap.h:67:18: error: 'class Nan :: Persistent <v8 :: Object>' tidak memiliki anggota bernama 'MarkIndependent' `
Michael

21

Saya tidak akan merekomendasikan modul sqlite3 node asli. Ini membutuhkan pembangunan kembali untuk bekerja dengan elektron. Ini adalah rasa sakit yang luar biasa untuk dilakukan - Setidaknya saya tidak pernah bisa membuatnya bekerja dan tidak ada instruksi untuk membangun kembali modul pada windows.

Sebagai gantinya, lihat modul 'sql.js' kripken yang merupakan sqlite3 yang telah dikompilasi 100% dalam JavaScript. https://github.com/kripken/sql.js/


3
Dokumen Electron cukup jelas bahwa untuk menggunakan modul asli yang dibundel, Anda diminta untuk membangunnya kembali agar dapat bekerja dengan electron. Gunakan utilitas electron-rebuild yang bekerja hampir sepanjang waktu atau secara manual mengatur flag gyp: electron.atom.io/docs/tutorial/using-native-node-modules
Bret

1
Maaf atas respon yang lambat. github.com/electron/electron-rebuild adalah alat yang berguna untuk membangun kembali dalam pengembangan. github.com/electron-userland/electron-builder/wiki/… menjelaskan strategi build multi-platform untuk build produksi. Tapi ingat, begitu Anda memperkenalkan deps asli, Anda kehilangan kemampuan untuk mengkompilasi silang untuk OS yang berbeda. github.com/nodejs/node-gyp#installation memiliki dokumen yang layak tentang alat kompilator windows yang diperlukan.
Bret

1
tidak satu pun dari komentar ini yang relevan dengan jawaban ini!
user3791372

14
Perlu disebutkan bahwa sql.js tidak dapat beroperasi pada sistem file. Setiap kali Anda perlu mengubah database, Anda harus menulis semuanya ke disk. Membuatnya sangat tidak berguna untuk sebagian besar skenario.
mode777

3
sql.js lebih seperti mainan, dibuat untuk bersenang-senang. Itu tidak bisa lebih baik dari NeDB dan database nosql lainnya, karena menyimpan semua database di memori. Jadi tidak ada alasan bagus untuk menggunakannya. Untuk database kecil gunakan nosql seperti NeDB, untuk yang lebih besar Anda harus mengkompilasi sqlite
Daimos

10

Ada dua aspek yang harus dipertimbangkan di sini:

  1. Pengaturan NODE_PATH: ini memungkinkan elektron mengetahui di mana menemukan modul Anda (lihat jawaban ini untuk penjelasan lengkap)
  2. Mengompilasi modul asli terhadap tajuk elektron: lihat dokumen resmi

Dan periksa pertanyaan-pertanyaan berikut, yang menanyakan hal yang sama:


Tip saya adalah mencoba lovefield (oleh Google).


Di Nodewebkit, saya harus mengkompilasi sqlite. Aturan yang sama berlaku untuk elektron?
Wexoni

@Wexoni AFAIK setiap modul node dengan binding asli harus dikompilasi terhadap header elektron.
Yan Foto

1
@Wexoni Saya belum pernah bekerja dengan NW, tapi saya tahu itu sqlite3harus dikompilasi sebelum dapat menggunakannya dalam electron. Apakah saya memahami pertanyaan Anda dengan benar?
Yan Foto

1
@YannBertrand mereka masih menggunakan header sendiri. Jadi saya kira Anda masih perlu mengkompilasinya terhadap header mereka.
Yan Foto

1
Terima kasih atas tip lovefield Anda. Benar-benar perpustakaan yang bagus.
Mostasim Billah

7

Saya mengalami masalah yang sama. Mencoba semuanya dan terakhir ini berhasil untuk saya: -

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

Ini akan membuat folder "electron-v1.3-win32-x64" di. \ Node_modules \ sqlite3 \ lib \ binding \ location yang digunakan oleh electron untuk menggunakan sqlite3.

Cukup mulai aplikasi dan Anda akan dapat menggunakan sqlite3 sekarang.


Itu baru saja membuat folder kosong, tetapi masih tidak ada node_sqlite3.nodefile di dalamnya
Mehdi Dehghani

electron-prebuilt telah diubah namanya menjadi electron. Untuk lebih jelasnya, lihat electron.atom.io/blog/2016/08/16/npm-install-electron
Jacob Nelson

6

Solusi yang lebih sederhana:

  1. Pasang rekondisi elektron npm i electron-rebuild --save-dev
  2. Luncurkan rekondisi elektron ./node_modules/.bin/electron-rebuild(atau .\node_modules\.bin\electron-rebuild.cmddi windows)
  3. Buka " node_modules / sqlite3 / lib / binding / " dan ganti nama folder " electron-v0.36-darwin-x64 " menjadi " node- v47 -darwin-x64 "

PS: v47 adalah versi saya, berhati-hatilah untuk memilih yang bagus (dalam kasus Anda v45 )


4
Bisakah Anda menjelaskan langkah ketiga? Mengapa mengganti nama?
m4heshd

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

Kemudian, di skrip package.json Anda, tambahkan baris ini:

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

Kemudian instal ulang untuk memicu pasca-instal:

npm install

Bekerja dengan sempurna untuk saya dalam kasus penggunaan kompleks yang juga melibatkan pembangun elektron, paket web elektron, dan sekuel.

Ia bekerja dalam mode dev electron-webpack dan dalam mode produksi untuk Windows dan Linux.




2

Lihat jawaban serupa di sini

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
seperti apa naskahnya prepublish?
Victor Ivens

0

Anda dapat membuat modul asli secara manual menggunakan visual studio.

  1. Unduh studio visual 2019.
  2. Instal paket "pengembangan desktop dengan c ++". Di tab detail penginstalan, pilih "MSVC v140 - VS 2015 C ++ build tools (v14.00)"
  3. Unduh pembangun elektron dalam proyek Anda.
  4. Di package.json buat skrip. "scripts": {"postinstall": "install-app-deps"}

  5. lalu jalankan scriptnya.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.