JavaScript 中的 SQLite 資料庫

Sahil Bhosale 2023年10月12日
  1. 在 JavaScript 中安裝所需的 Node.js 依賴項
  2. 在 JavaScript 中的 Node.js 中建立 SQLite 資料庫
  3. 在 JavaScript 中使用 Node.js 將資料插入 SQLite 資料庫
  4. 在 JavaScript 中使用 Node.js 從 SQLite 資料庫訪問資料
  5. 在 JavaScript 中使用 Node.js 從 SQLite 資料庫中刪除資料
JavaScript 中的 SQLite 資料庫

瀏覽器提供各種儲存系統,如本地儲存、會話儲存和索引資料庫。這些儲存系統可以在瀏覽器本身內臨時儲存特定時間的資料。

但有時,你可能需要將資料臨時儲存在某個儲存或資料庫系統中更長時間。那麼,在這種情況下,使用本地儲存、會話儲存或索引資料庫可能不是一個好的選擇。

我們可以使用第 3 部分資料庫系統,例如關聯式資料庫或 NoSQL 資料庫,如 SQLite、SQL、MongoDB 等。並且不乏這些選項。

SQLite 是一個輕量級的關聯式資料庫管理系統。本教程將使用 JavaScript 程式語言對此資料執行各種 CRUD 操作,例如建立、讀取、更新和刪除。

由於我們正在實現後端(即資料庫模型),我們將使用名為 Node.js 的 JavaScript 執行時。

在 JavaScript 中安裝所需的 Node.js 依賴項

首先,我們必須使用 npm init 建立一個專案,然後將 index.js 檔案新增到該專案。

要在 Node.js 中實現 SQLite 資料庫,我們必須通過使用節點包管理器 (npm) 執行以下命令來安裝一個名為 sqlite3 的包。

npm install sqlite3

安裝依賴後,你可以將其匯入 index.js 檔案並將其儲存在變數 sqlite3 中,如下所示。你可以給這個變數起任何名字,但最好給它一個合適的名字,這樣我們就可以很容易地理解它。

var sqlite3 = require('sqlite3').verbose();

verbose() 函式將執行模式設定為詳細以產生長堆疊跟蹤。

在 JavaScript 中的 Node.js 中建立 SQLite 資料庫

要建立一個資料庫,我們必須建立一個 sqlite3 的物件。它有一個名為 Database() 的方法,我們必須通過傳遞引數來呼叫它。

該引數將告訴 sqlite3 它應該將資料儲存在哪裡。對於這個例子,我們將把資料庫儲存在系統記憶體中。

但是,如果你想將資料庫儲存在一個檔案中(你必須這樣做),那麼在這種情況下,你必須建立一個具有 .db 副檔名的新檔案,然後將檔案的相對位置傳遞為 Database() 方法的字串值。然後我們將資料庫引用儲存在變數 db 中。

資料庫模式將具有 idname 列。在資料庫的 name 列中,我們將儲存使用者的名稱。

我們將首先建立一個名為 users 的陣列,其中包含陣列的名稱。

var db = new sqlite3.Database(':memory:');

const users = ['Sara', 'Mike', 'James', 'David', 'Emily'];

db.serialize(function() {
  db.run('CREATE TABLE mytable (id, name)');
});

db.close();

我們將在 db 上使用 serialize() 方法,將回撥函式作為引數。serialize() 方法將一次執行我們在此方法中編寫的程式碼。

這是至關重要的,因為我們希望逐步執行資料庫操作。例如,我們首先必須建立資料庫,然後向其中插入一些值,而不是相反。

我們將使用 run() 方法在回撥函式中執行資料庫查詢,並建立名為 mytable 的資料庫,其中包含兩列 (id, name)

在資料庫上執行我們的任務後,我們總是必須使用 close() 方法關閉資料庫連線。

我們將建立單獨的方法來插入資料、訪問資料和從資料庫中刪除資料。製作完這些函式後,我們將在 serialize() 方法的回撥函式中呼叫這些函式。

在 JavaScript 中使用 Node.js 將資料插入 SQLite 資料庫

我們建立了一個名為 insertData() 的單獨函式來將資料插入資料庫。由於 db 引用是全域性可用的,我們可以在 insertData() 函式中訪問它。

我們將使用 prepare() 方法編寫插入查詢,將資料插入資料庫。該查詢將在 mytable 資料庫中插入兩個值 (?,?),然後我們將此查詢儲存在變數 insertQuery 中。

現在我們可以使用包含資料庫查詢的 insertQuery 變數將資料插入資料庫。我們將從 users 陣列中新增使用者名稱。

我們將使用 for 迴圈,然後從 users 陣列中獲取每個名稱及其在資料庫中的索引。正如我們已經說過的,要執行資料庫查詢,我們使用 run() 方法。

每次插入後,我們都會在控制檯列印資料插入成功的訊息。

function insertData() {
  var insertQuery = db.prepare('INSERT INTO mytable VALUES (?,?)');
  for (var i = 0; i < users.length; i++) {
    insertQuery.run(i, users[i]);
    console.log('Data inserted successfully...');
  }
  insertQuery.finalize();
}

最後,在我們將所有資料插入資料庫後,我們將使用 finalize() 方法完成插入過程。

在 JavaScript 中使用 Node.js 從 SQLite 資料庫訪問資料

要訪問我們已插入資料庫的資料,我們必須使用關聯式資料庫的 SELECT 查詢。我們建立了另一個名為 accessData() 的函式。

由於我們要訪問所有資料庫行,我們將使用 sqlite3 包提供的 each() 方法。

each() 方法有兩個引數,第一個是選擇查詢,第二個是回撥函式,它將丟擲錯誤或為我們提供資料庫的每一行。

假設我們在從資料庫中檢索一些資料時遇到了一些錯誤。我們會丟擲錯誤資訊;如果一切按預期進行,我們將使用 row 物件列印資料庫中存在的 idname

function accessData() {
  db.each('SELECT * FROM mytable', function(err, row) {
    if (error) return console.log(err.message);
    console.log(row.id + ': ' + row.name);
  });
}

在 JavaScript 中使用 Node.js 從 SQLite 資料庫中刪除資料

要從資料庫中刪除資料庫,我們將建立一個名為 deleteData 的函式。此函式將採用單個引數名稱(必須從資料庫中刪除的名稱)。

同樣,為了執行資料庫的 DELETE 查詢,我們將在資料庫上使用 run 方法。

對於這個函式,我們將把 DELETE 查詢作為第一個引數傳遞,這將從資料庫中刪除一個名稱,而需要刪除的名稱將作為第二個引數傳遞給函式。

function deleteData(name) {
  db.run('DELETE FROM mytable WHERE name=?', name, err => {
    if (err) return console.log(err.message);
    console.log(`${name} deleted successfully...`);
  });
}

第三個引數是回撥,如果出現問題會丟擲錯誤。但假設資料已成功從資料庫中刪除。

如上所示,我們將列印一條訊息,表明你要刪除的任何名稱都已成功刪除。

最後,如下所示,我們將呼叫我們在 serialize() 函式的回撥中建立的所有這三個函式。最後,我們將從資料庫中刪除名稱 James

db.serialize(function() {
  db.run('CREATE TABLE mytable (id, name)');

  insertData();
  accessData();
  deleteData('James');
});

db.close();

在這個階段,你使用 npm start 命令執行資料庫。

輸出:

執行資料庫

要驗證姓名 James 是否已從資料庫中完全刪除,你可以再次呼叫 accessData() 函式。

輸出:

驗證 James 是否已被刪除

如你所見,名稱 James 已從資料庫中刪除。

作者: Sahil Bhosale
Sahil Bhosale avatar Sahil Bhosale avatar

Sahil is a full-stack developer who loves to build software. He likes to share his knowledge by writing technical articles and helping clients by working with them as freelance software engineer and technical writer on Upwork.

LinkedIn