Electron操作SQLite數(shù)據(jù)庫
目錄
一、 背景 2
二、 數(shù)據(jù)庫選型 2
(一) LocalStorage 2
(二) SessionStorage 2
(三) WebSQL 2
(四) Cookies 2
(五) IndexedDB 3
(六) SQLite 3
三、 electron安裝SQLite3和環(huán)境配置 4
(一) 安裝python環(huán)境 5
(二) 構(gòu)建工具下載 5
(三) 開始安裝 5
1. 方案一 5
2. 方案二 7
四、 SQLite可視化管理工具 7
(一) SQLite studio 8
(二) Sqlitespy 9
(三) Navicat for SQLite 9
五、 操作SQLite3數(shù)據(jù)庫 10
六、 參考文獻(xiàn) 12
一、 背景
在我們開發(fā)某款應(yīng)用程序的時(shí)候,可能會需要用到本地?cái)?shù)據(jù)庫,而不是一直通過 restful 接口,使用遠(yuǎn)程數(shù)據(jù)庫。所以我們在應(yīng)用中需要加入數(shù)據(jù)庫,究其根本就是 electron 搭配數(shù)據(jù)庫。那么,數(shù)據(jù)庫要選擇哪個(gè)呢?

二、 數(shù)據(jù)庫選型
(一) LocalStorage
LocalStorage 存儲的數(shù)據(jù)保存在瀏覽器中。存儲容量很小,大概不會超過 10M,它是以鍵值對形式保存數(shù)據(jù)的,沒有關(guān)聯(lián)查詢、條件查詢的機(jī)制。
(二) SessionStorage
SessionStorage 跟 LocalStorage 很相似,區(qū)別是每次關(guān)閉會話,其中的內(nèi)容會被清空。在窗口中打開頁面會復(fù)制頂級瀏覽會話的上下文作為新會話的上下文。相同 url 的不同 tabs 頁面,其中的值是不同的。有過期時(shí)間設(shè)置,想持久化存儲數(shù)據(jù),它是做不到的。
(三) WebSQL
Web SQL 數(shù)據(jù)庫 API 并不是 HTML5 規(guī)范的一部分,但是它是一個(gè)獨(dú)立的規(guī)范。WebSQL 是在瀏覽器上模擬數(shù)據(jù)庫,使用 js 來操作 SQL 完成對數(shù)據(jù)的讀寫。
(四) Cookies
Cookies 存儲容量太小,只能存 4kb 的內(nèi)容,而且每次與服務(wù)端交互,同域下的 Cookie 還會被攜帶到服務(wù)端,也沒有關(guān)聯(lián)查詢、條件查詢的機(jī)制。
數(shù)據(jù)以 Json 格式保存在本地文件中,以這種方式存儲一些用戶的配置信息是完全沒問題的。但要用這種方式存儲大量結(jié)構(gòu)化數(shù)據(jù),就很不合理了。主要原因是:用這種方案操作數(shù)據(jù)是需要把文件中的所有數(shù)據(jù)都加載到客戶端電腦的內(nèi)存中去的。由于沒有索引機(jī)制,關(guān)聯(lián)查詢、條件查詢等操作效率不高,更新了某項(xiàng)數(shù)據(jù)之后,要持久化更新操作,又要重寫整個(gè)文件。
(五) IndexedDB
IndexedDB 是一種底層 API,用于在客戶端存儲大量的結(jié)構(gòu)化數(shù)據(jù)。該 API 使用索引實(shí)現(xiàn)對數(shù)據(jù)的高性能搜索。
IndexedDB 是一個(gè)事務(wù)型數(shù)據(jù)庫系統(tǒng),類似于基于 SQL 的 RDBMS。然而,不像 RDBMS 使用固定列表,IndexedDB 是一個(gè)基于 js 的面向?qū)ο髷?shù)據(jù)庫。IndexedDB 可以存儲和檢索用鍵索引的對象。只需要指定數(shù)據(jù)庫模式,打開與數(shù)據(jù)庫的連接,然后檢索和更新一系列事務(wù)。
(六) SQLite
官網(wǎng)地址:https://sqlite.org/index.html 。
SQLite 是一個(gè)進(jìn)程內(nèi)的庫,實(shí)現(xiàn)了自給自足的、無服務(wù)器的、零配置的、事務(wù)性的 SQL 數(shù)據(jù)庫引擎。它是一個(gè)零配置的數(shù)據(jù)庫,這意味著與其他數(shù)據(jù)庫不一樣,我們不需要在系統(tǒng)中配置。
就像其他數(shù)據(jù)庫,SQLite 引擎不是一個(gè)獨(dú)立的進(jìn)程,可以按應(yīng)用程序需求進(jìn)行靜態(tài)或動態(tài)連接。SQLite 直接訪問其存儲文件。
特性:
不需要一個(gè)單獨(dú)的服務(wù)器進(jìn)程或操作的系統(tǒng); 一個(gè)完整的 SQLite數(shù)據(jù)庫是存儲在一個(gè)單一的跨平臺的磁盤文件中;SQLite是自給自足的,這意味著不需要任何外部的依賴;SQLite事務(wù)是完全兼容ACID的,允許從多個(gè)進(jìn)程或線程安全訪問。
通過比較,我們選擇了 SQLite3 作為 electron 搭配的數(shù)據(jù)庫。SQLite3 的使用和 api 可以通過菜鳥教程進(jìn)行學(xué)習(xí) https://www.runoob.com/sqlite/sqlite-where-clause.html 。

三、 electron安裝SQLite3和環(huán)境配置
在應(yīng)用終端中下載依賴包:
npm install sqlite3 –save-dev
啟動應(yīng)用又提示我去安裝aws-sdk:
npm install --save aws-sdk
啟動應(yīng)用又報(bào)如下錯(cuò)誤,真是多災(zāi)多難:

看來安裝 SQLite 沒有這么簡單,還是需要做一些準(zhǔn)備工作的。比如需要 python 環(huán)境(python2.7)和vsBuildTools構(gòu)建工具(Visual Studio 15生成工具2017)。

(一) 安裝python環(huán)境
我的 python 版本:

下載地址:https://www.python.org/downloads 。下載并且安裝 python,將默認(rèn)沒有勾選的“加入系統(tǒng)變量path”的選項(xiàng)勾選上,配置好環(huán)境變量后,在終端里測試一下。
(二) 構(gòu)建工具下載
我安裝的是 Visual Studio 15生成工具2017

還需要執(zhí)行
npm install windows-build-tools –g
安裝 windows-build-tools。
(三) 開始安裝
1. 方案一
cnpm install sqlite3@latest --build-from-source --runtime=electron --target=1.7.9 --dist-url=https://atom.io/download/electron --save
不要使用 npm。否則報(bào)錯(cuò)如下:

使用 cnpm 去安裝它。
執(zhí)行命令開始安裝最新版的 SQLite3。

其實(shí)這個(gè)過程中,會試圖下載 SQLite3 和我指定版本的 electron 的 prebuild 版本,沒有發(fā)現(xiàn)的話。就會重新構(gòu)建一份合適的版本出來。
2. 方案二
執(zhí)行下面三條命令:
npm install sqlite3 --save
npm install electron-rebuild --save
.\node_modules\.bin\electron-rebuild.cmd
這兩個(gè)方案隨便選一條執(zhí)行,就能安裝成功。安裝成功后,就可以順利使用 SQLite。

四、 SQLite可視化管理工具
生成的數(shù)據(jù)庫并不是雙擊就能打開預(yù)覽數(shù)據(jù),所以就需要一款可視化管理工具。SQLite 的可視化管理工具,是做 SQLite 相關(guān)開發(fā)的必備軟件。對于可視化管理工具,并不像 mysql 一樣,SQLite 可選擇的范圍并不多。
(一) SQLite studio
官網(wǎng)地址:https://sqlitestudio.pl/ ,提供下載。
SQLiteStudio 是一款可以幫助用戶管理 SQLite 數(shù)據(jù)庫的工具。該 SQLiteStudio 數(shù)據(jù)庫管理工具具有功能完善的 SQLite2 和 SQLite3 工具,視圖編碼支持 utf8,還可以同時(shí)打開多個(gè)數(shù)據(jù)庫文件。

特點(diǎn):
功能完善的SQLite2和SQLite3工具; 視圖編碼支持utf8; 支持導(dǎo)出數(shù)據(jù)格式:csv、html、plain、sql、xml; 可同時(shí)打開多個(gè)數(shù)據(jù)庫文件; 支持查看和編輯二進(jìn)制字段; 輕量級,獨(dú)立性,沒有依賴; 隔離性,全部在一個(gè)文件夾系統(tǒng); 跨平臺,支持眾多操作系統(tǒng); 多語言接口 支持眾多編程語言; 安全性,通過獨(dú)占性和共享鎖來實(shí)現(xiàn)獨(dú)立事務(wù)的處理,多個(gè)進(jìn)程可以在同一個(gè)時(shí)間內(nèi)從同一個(gè)數(shù)據(jù)庫讀取數(shù)據(jù),但只有一個(gè)可以寫入數(shù)據(jù); 支持?jǐn)?shù)據(jù)庫大小至2TB。
(二) Sqlitespy
下載地址:https://www.yunqa.de/delphi/products/sqlitespy/index 。
SQLiteSpy 是一款針對 SQLite3 數(shù)據(jù)庫進(jìn)行可視化管理的工具,不需要安裝,只需將該軟件提起到任何目錄和執(zhí)行文件就能立即開始工作,軟件是一個(gè)獨(dú)立的管理工具,他不會與數(shù)據(jù)庫中的文件及程序產(chǎn)生沖突,操作起來非常方便。用戶只需懂基礎(chǔ)的 SQL 語句就可以輕松執(zhí)行 SQL 查詢,視圖、復(fù)制和刪除表、編輯單元格,以及查看索引,觸發(fā)器和排序規(guī)則等操作,非常便捷。
(三) Navicat for SQLite
網(wǎng)站地址:https://www.navicat.com.cn/products/navicat-for-sqlite 。
Navicat for SQLite 是一款強(qiáng)大而全面的 SQLite 圖形用戶界面,提供了一套完整的數(shù)據(jù)庫管理和開發(fā)功能,并且支持優(yōu)化SQLite工作流程和生產(chǎn)力,通過它我們可以快速、安全地創(chuàng)建、組織、訪問和共享信息。

特點(diǎn):
數(shù)據(jù)傳輸和數(shù)據(jù)同步以低成本輕松快速地遷移數(shù)據(jù); 能將不同格式的數(shù)據(jù)傳輸?shù)綌?shù)據(jù)。表、視圖或查詢結(jié)果的數(shù)據(jù)可導(dǎo)出為 Excel、Access、CSV 等格式; 可視化 SQL 創(chuàng)建工具幫助我們創(chuàng)建、編輯和運(yùn)行 SQL 語句,而不必?fù)?dān)心語法和正確命令的用法。透過關(guān)鍵字建議和減少重復(fù)輸入相同的代碼,自動完成代碼和自定義的代碼段功能可讓編碼更加快速。

五、 操作SQLite3數(shù)據(jù)庫
在項(xiàng)目中的 background 文件夾中創(chuàng)建 sqlite3db.js 文件,引入 SQLite3 并初始化數(shù)據(jù)庫,然后新建一張表,最后插入數(shù)據(jù)。
import sq3 from "sqlite3";
const sqlite3 = sq3.verbose()
const db = new sqlite3.Database('sq3.db')
db.serialize(() => {
db.run("create table test(name varchar(20))", () => {
db.run("insert into test values('nihao')", () => {
db.all("select * from test", (err, res) => {
if (err) throw err
console.log(JSON.stringify(res))
})
})
})
})
export default db
在 main.js 中導(dǎo)入并且使用
import sqlite3db from './sqlite3db'
// 數(shù)據(jù)庫
app.sqlite3db = sqlite3db
啟動應(yīng)用,根目錄下生成數(shù)據(jù)庫。
使用 sqlite studio 打開,添加數(shù)據(jù)庫,查看導(dǎo)入的數(shù)據(jù)。

選擇文件路徑,添加數(shù)據(jù)庫。

選擇 test 表,切換到數(shù)據(jù),查看插入的值。

導(dǎo)入成功。
六、 參考文獻(xiàn)
https://newsn.net/say/electron-install-sqlite3.html
https://www.cnblogs.com/liulun/p/13061672.html
- END -最后,希望大家一定要點(diǎn)贊三連。
一個(gè)學(xué)習(xí)編程技術(shù)的公眾號。每周推送高質(zhì)量的優(yōu)秀博文、開源項(xiàng)目、實(shí)用工具、面試技巧、編程學(xué)習(xí)資源等等。目標(biāo)是做到個(gè)人技術(shù)與公眾號一起成長。歡迎大家關(guān)注,一起進(jìn)步,走向全棧大佬的修煉之路
