JavaScript 中的 SQLite 数据库

Sahil Bhosale 2024年2月15日
  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