Web 應用如何使用sqlite?使用 sql.js 實現前端 SQLite 數據庫操作

前言

在 Web 應用開發中,前端數據處理的重要性日益增加。為了實現更高效的前端數據管理,特別是在處理結構化數據時,sql.js 提供了一個出色的解決方案。sql.js 是將 SQLite 數據庫編譯為 JavaScript 的庫,允許開發者在瀏覽器環境中直接操作 SQLite 數據庫。本教程將詳細介紹如何使用 sql.js 實現多張表的關聯操作,從而提高前端數據處理的靈活性和效率。

什么是 sql.js?

sql.js 是一個用 JavaScript 實現的 SQLite 數據庫。SQLite 是一種自包含、無服務器、零配置、事務性 SQL 數據庫引擎。簡而言之,它提供了一種在瀏覽器中輕松操作結構化數據的方法。

準備工作

在開始之前,我們需要確保先下載 sql.js。你可以通過以下方式獲取:

通過 NPM 安裝

npm install sql.js

通過 CDN 引入

<script src="https://cdnjs.cloudflare.com/ajax/libs/sql.js/1.6.1/sql-wasm.js"></script>

使用指南

接下來,我們來看如何在代碼中使用 sql.js。

1. 初始化數據庫

首先,我們需要創建一個數據庫實例。你可以使用一段簡單的 JavaScript 代碼來完成這一步:

const initSqlJs = window.initSqlJs;initSqlJs().then(function (SQL) {// 創建一個新的數據庫const db = new SQL.Database();// 輸出數據庫對象console.log(db);
});

2. 創建表格

有了數據庫實例之后,我們就可以開始創建表格了。我們將創建一個簡單的用戶信息表,包括 id 和 name 兩個字段:

initSqlJs().then(function (SQL) {const db = new SQL.Database();// 創建一個用戶表db.run("CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)");console.log("Table created successfully!");
});

3. 插入數據

表格創建好之后,我們就可以插入一些數據了:

initSqlJs().then(function (SQL) {const db = new SQL.Database();db.run("CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)");// 插入一些數據db.run("INSERT INTO users (id, name) VALUES (?, ?)", [1, 'Alice']);db.run("INSERT INTO users (id, name) VALUES (?, ?)", [2, 'Bob']);console.log("Data inserted successfully!");
});

4. 查詢數據

插入數據后,我們可以查詢數據。以下代碼展示了如何從數據庫中查詢數據:

initSqlJs().then(function (SQL) {const db = new SQL.Database();db.run("CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)");db.run("INSERT INTO users (id, name) VALUES (?, ?)", [1, 'Alice']);db.run("INSERT INTO users (id, name) VALUES (?, ?)", [2, 'Bob']);// 查詢數據const res = db.exec("SELECT * FROM users");// 輸出查詢結果console.log(res);
});

5. 更新數據

有時候我們需要更新已經存在的數據。以下代碼展示了如何更新用戶表中的數據:

initSqlJs().then(function (SQL) {const db = new SQL.Database();db.run("CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)");db.run("INSERT INTO users (id, name) VALUES (?, ?)", [1, 'Alice']);db.run("INSERT INTO users (id, name) VALUES (?, ?)", [2, 'Bob']);// 更新數據db.run("UPDATE users SET name = ? WHERE id = ?", ['Charlie', 1]);// 查詢更新后的數據const res = db.exec("SELECT * FROM users");console.log(res);
});

6. 刪除數據

最后,我們來看如何刪除數據:

initSqlJs().then(function (SQL) {const db = new SQL.Database();db.run("CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)");db.run("INSERT INTO users (id, name) VALUES (?, ?)", [1, 'Alice']);db.run("INSERT INTO users (id, name) VALUES (?, ?)", [2, 'Bob']);// 刪除數據db.run("DELETE FROM users WHERE id = ?", [1]);// 查詢刪除后的數據const res = db.exec("SELECT * FROM users");console.log(res);
});

進階操作:多張表關聯

在實際的應用場景中,通常需要關聯多張表來完成更復雜的數據查詢和操作。

1. 創建多張表

接下來,我們創建兩個表:users 和 orders。users 表存儲用戶信息,orders 表存儲用戶的訂單信息,并通過 user_id 關聯到 users 表。

initSqlJs().then(function (SQL) {const db = new SQL.Database();// 創建用戶表db.run("CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)");// 創建訂單表db.run("CREATE TABLE orders (id INTEGER PRIMARY KEY, user_id INTEGER, product TEXT)");console.log("Tables created successfully!");
});

2. 插入數據

創建好表之后,我們向表中插入一些數據:

initSqlJs().then(function (SQL) {const db = new SQL.Database();db.run("CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)");db.run("CREATE TABLE orders (id INTEGER PRIMARY KEY, user_id INTEGER, product TEXT)");// 插入用戶數據db.run("INSERT INTO users (id, name) VALUES (?, ?)", [1, 'Alice']);db.run("INSERT INTO users (id, name) VALUES (?, ?)", [2, 'Bob']);// 插入訂單數據db.run("INSERT INTO orders (id, user_id, product) VALUES (?, ?, ?)", [1, 1, 'Laptop']);db.run("INSERT INTO orders (id, user_id, product) VALUES (?, ?, ?)", [2, 1, 'Phone']);db.run("INSERT INTO orders (id, user_id, product) VALUES (?, ?, ?)", [3, 2, 'Tablet']);console.log("Data inserted successfully!");
});

3. 查詢關聯數據

我們可以通過 SQL 聯合查詢來獲取關聯表的數據。例如,獲取所有用戶及其對應的訂單信息:

initSqlJs().then(function (SQL) {const db = new SQL.Database();db.run("CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)");db.run("CREATE TABLE orders (id INTEGER PRIMARY KEY, user_id INTEGER, product TEXT)");db.run("INSERT INTO users (id, name) VALUES (?, ?)", [1, 'Alice']);db.run("INSERT INTO users (id, name) VALUES (?, ?)", [2, 'Bob']);db.run("INSERT INTO orders (id, user_id, product) VALUES (?, ?, ?)", [1, 1, 'Laptop']);db.run("INSERT INTO orders (id, user_id, product) VALUES (?, ?, ?)", [2, 1, 'Phone']);db.run("INSERT INTO orders (id, user_id, product) VALUES (?, ?, ?)", [3, 2, 'Tablet']);// 聯合查詢用戶及其訂單數據const res = db.exec(`SELECT users.name AS user_name, orders.product AS productFROM usersJOIN orders ON users.id = orders.user_id`);console.log(res);
});

4. 處理查詢結果

db.exec 返回的結果是一個數組,數組中的每個元素是一個對象,代表了查詢結果的一個表格。你需要解析這個結果以展示數據:

initSqlJs().then(function (SQL) {const db = new SQL.Database();db.run("CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)");db.run("CREATE TABLE orders (id INTEGER PRIMARY KEY, user_id INTEGER, product TEXT)");db.run("INSERT INTO users (id, name) VALUES (?, ?)", [1, 'Alice']);db.run("INSERT INTO users (id, name) VALUES (?, ?)", [2, 'Bob']);db.run("INSERT INTO orders (id, user_id, product) VALUES (?, ?, ?)", [1, 1, 'Laptop']);db.run("INSERT INTO orders (id, user_id, product) VALUES (?, ?, ?)", [2, 1, 'Phone']);db.run("INSERT INTO orders (id, user_id, product) VALUES (?, ?, ?)", [3, 2, 'Tablet']);const res = db.exec(`SELECT users.name AS user_name, orders.product AS productFROM usersJOIN orders ON users.id = orders.user_id`);// 解析查詢結果if (res.length > 0) {const columns = res[0].columns;const values = res[0].values;values.forEach(row => {const record = {};row.forEach((value, index) => {record[columns[index]] = value;});console.log(record);  // 輸出每一條記錄});}
});

總結

通過 sql.js,我們可以在瀏覽器中輕松地操作 SQLite 數據庫。它提供了一個強大的工具,使我們能夠在前端進行復雜的數據操作而無需依賴后端服務器。這意味著我們可以構建更為響應和靈活的Web應用。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/63135.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/63135.shtml
英文地址,請注明出處:http://en.pswp.cn/web/63135.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

docker 安裝 mysql8.0容器外無法連接

文章目錄 概要問題描述解決方案其他命令 概要 主要是mysql5.7和mysql8.0的兼容性問題。 排查了很久 其實就是配置文件的一句話的事情 感覺mysql8.0更為嚴謹 這樣可能是考慮杜絕一些漏洞吧 問題描述 在容器內 netstat -an | grep 3306 都不行 在容器外 netstat -an | grep 2…

TCP協議簡單分析和握手揮手過程

TCP介紹 TCP是可靠的傳輸層協議&#xff0c;建立連接之前會經歷3次握手的階段。 確認機制&#xff1a;接受方 收到數據之后會向 發送方 回復ACK重傳機制&#xff1a;發送方 在一定時間內沒有收到 接收方的ACK就會重新發送 握手目的&#xff1a;與端口建立連接 TCP的三次握手 …

VisualStudio vsix插件自動加載

本文介紹如何在Visual Studio擴展中實現PackageRegistration&#xff0c;包括設置UseManagedResourcesOnly為true&#xff0c;允許背景加載&#xff0c;并針對C#、VB、F#項目提供自動裝載&#xff0c;附官方文檔鏈接。增加以下特性即可…… [PackageRegistration(UseManagedRe…

opencv所有常見函數

一、opencv圖像操作 二、opencv圖像的數值運算 三、opencv圖像的放射變換 四、opencv空間域圖像濾波 五、圖像灰度化與直方圖 六、形態學圖像處理 七、閾值處理與邊緣檢測 八、輪廓和模式匹配

【Excel】單元格分列

目錄 分列&#xff08;新手友好&#xff09; 1. 選中需要分列的單元格后&#xff0c;選擇 【數據】選項卡下的【分列】功能。 2. 按照分列向導提示選擇適合的分列方式。 3. 分好就是這個樣子 智能分列&#xff08;進階&#xff09; 高級分列 Tips&#xff1a; 新手推薦基…

【STM32練習】基于STM32的PM2.5環境監測系統

一.項目背景 最近為了完成老師交付的任務&#xff0c;遂重制了一下小項目用STM32做一個小型的環境監測系統。 項目整體示意框圖如下&#xff1a; 二.器件選擇 單片機&#xff08;STM32F103&#xff09;數字溫濕度模塊&#xff08;DHT11&#xff09;液晶顯示模塊&#xff08;0.8…

《開源數據:開啟信息共享與創新的寶藏之門》

《開源數據&#xff1a;開啟信息共享與創新的寶藏之門》 一、開源數據概述&#xff08;一&#xff09;開源數據的定義&#xff08;二&#xff09;開源數據的發展歷程 二、開源數據的優勢&#xff08;一&#xff09;成本效益優勢&#xff08;二&#xff09;靈活性與可定制性&…

ReactPress最佳實踐—搭建導航網站實戰

Github項目地址&#xff1a;https://github.com/fecommunity/easy-blog 歡迎Star。 近期&#xff0c;阮一峰在科技愛好者周刊第 325 期中推薦了一款開源工具——ReactPress&#xff0c;ReactPress一個基于 Next.js 的博客和 CMS 系統&#xff0c;可查看 demo站點。&#xff08;…

2024,大模型殺進“決賽圈”

Henry Chesbrough在著作《通過技術創新盈利勢在必行》中&#xff0c;曾提出過一個創新的“漏斗模型”。開放式創新一開始鼓勵百花齊放&#xff0c;但最終只有10%的技術能夠通過這個漏斗&#xff0c;成功抵達目標市場target market&#xff0c;進入到商業化與產業化的下一個階段…

STM8單片機學習筆記·GPIO的片上外設寄存器

目錄 前言 IC基本定義 三極管基礎知識 單片機引腳電路作用 STM8GPIO工作模式 GPIO外設寄存器 寄存器含義用法 CR1&#xff1a;Control Register 1 CR2&#xff1a;Control Register 2 ODR&#xff1a;Output Data Register IDR&#xff1a;Input Data Register 賦值…

頁面加載速度優化策略:提升用戶體驗的關鍵

文章目錄 前言一、為什么需要優化頁面加載速度&#xff1f;二、前端優化技術三、后端優化策略四、構建與部署優化五、案例研究&#xff1a;實際效果展示結語 前言 在當今快節奏的互聯網環境中&#xff0c;頁面加載速度不僅是用戶體驗的重要組成部分&#xff0c;更是影響網站性…

【CSS in Depth 2 精譯_081】 13.1:CSS 漸變效果(下)——CSS 徑向漸變(13.1.3)+ CSS 錐形漸變(13.1.4)

當前內容所在位置&#xff08;可進入專欄查看其他譯好的章節內容&#xff09; 第四部分 視覺增強技術 ??【第 13 章 漸變、陰影與混合模式】 ?? 13.1 漸變 ?? 13.1.1 使用多個顏色節點&#xff08;上&#xff09;13.1.2 顏色插值方法&#xff08;中&#xff09;13.1.3 徑…

商務禮儀學習筆記

時間,場合,地點 女士: 1. 著裝(裙裝套裝,最短不能超過膝蓋一拳,裙子形狀直通,顏色簡單不能花里胡哨,上下顏色不能超過三種,深灰深藍;上下顏色,裝飾,面料統一;絲襪不要過于花,肉色透明比較推薦) 2. 妝容和發型(經過搭理,不要毛躁; 膚色保持一致,均衡;腮紅…

ubuntu 用 ss-tproxy的最終網絡結構

1、包含了AD廣告域名篩選 2、Ss-tproxy 國內國外地址分類 3、chinadns-ng解析 4、透明網關 更多細節看之前博客 ubuntu 用ss-TPROXY實現透明代理&#xff0c;基于TPROXY的透明TCP/UDP代理,在 Linux 2.6.28 后進入官方內核。ubuntu 用 ss-tproxy的內置 DNS 前掛上 AdGuardHome…

iOS swift開發系列--如何給swiftui內容視圖添加背景圖片顯示

我需要在swiftui項目中顯示背景圖&#xff0c;有兩種方式&#xff0c;一種是把圖片拖入asset資源中&#xff0c;另外一種是直接把圖片放在源碼目錄下。采用第一種方式&#xff0c;直接把圖片拖到資源目錄&#xff0c;但是swiftui項目沒有彈出&#xff0c; “Copy items if need…

BUUCTF Pwn [HarekazeCTF2019]baby_rop2 題解

下載 得到兩個文件 checksec 64位 拖入IDA64 查看main函數 看到給了個libc說明這題是ret2libc題 這里的打印函數是printf 所以利用printf函數的plt輸出真實地址got 但printf的got好像不行 所以換成了read的got 因為這是64位程序 所以用寄存器傳參&#xff1b;又因為printf得…

語音識別失敗 chrome下獲取瀏覽器錄音功能,因為安全性問題,需要在localhost或127.0.0.1或https下才能獲取權限

環境&#xff1a; Win10專業版 谷歌瀏覽器 版本 131.0.6778.140&#xff08;正式版本&#xff09; &#xff08;64 位&#xff09; 問題描述&#xff1a; 局域網web語音識別出現識別失敗 chrome控制臺出現下獲取瀏覽器錄音功能&#xff0c;因為安全性問題&#xff0c;需要在…

【前端知識】Javascript進階-類和繼承

文章目錄 概述一、類&#xff08;Class&#xff09;二、繼承&#xff08;Inheritance&#xff09; 三、繼承的實現方式作用一、類和作用二、繼承和作用 概述 當然可以&#xff0c;以下是對JavaScript中類和繼承的詳細介紹&#xff1a; 一、類&#xff08;Class&#xff09; 定…

前端搭建企業級項目的具體步驟?

?前端搭建企業級項目的具體步驟如下?&#xff1a; ?確定項目技術棧和規劃項目結構?&#xff1a;首先&#xff0c;確定使用的前端框架&#xff0c;如Vue.js&#xff0c;并規劃項目的目錄結構&#xff0c;包括src、components、routes、store等?。 ?準備開發環境?&#x…

Less和SCSS,哪個更好用?

前言 Less 和 SCSS 都是流行的 CSS 預處理器&#xff0c;它們的目的都是擴展 CSS 的功能&#xff0c;使樣式表更具組織性、可維護性和可重用性。雖然它們有許多相似之處&#xff0c;但在語法、特性和工作方式上也存在一些差異。 Less Less 是一種動態樣式表語言&#xff0c;…