如何在 Ubuntu 22.04 上使用 SQLite 和 Node.js如何在 Ubuntu 22.04 上使用 SQLite 和 Node.js如何在 Ubuntu 22.04 上使用 SQLite 和 Node.js如何在 Ubuntu 22.04 上使用 SQLite 和 Node.js
  • 文章
  • 正则表达式
    • 工具
  • 登录
找到的结果: {phrase} (显示: {results_count} 共: {results_count_total})
显示: {results_count} 共: {results_count_total}

加载更多搜索结果...

搜索范围
模糊匹配
搜索标题
搜索内容
发表 admin at 2025年2月28日
类别
  • 未分类
标签

如何在 Ubuntu 22.04 上使用 SQLite 和 Node.js

作者选择了 Write for DOnations 计划。

介绍

SQLite 是一种流行的开源 SQL 数据库引擎,用于存储数据。它是无服务器的,这意味着它不需要服务器即可运行;相反,它读取数据并将数据写入驻留在计算机磁盘上的文件。此外,SQLite 不需要任何配置;这使得它更便携,成为嵌入式系统、桌面/移动应用程序和原型制作等的流行选择。

要将 SQLite 与 Node.js 一起使用,您需要一个连接到 SQLite 数据库并将 SQL 语句从您的应用程序发送到数据库以供执行的数据库客户端。一种流行的选择是 node-sqlite3 包,它为 SQLite 3 提供异步绑定。

在本教程中,您将使用 node-sqlite3 创建与 SQLite 数据库的连接。接下来,您将创建一个 Node.js 应用程序来创建一个表并将数据插入数据库。最后,您将修改应用程序以使用 node-sqlite3 从数据库中检索、更新和删除数据。

先决条件

要学习本教程,您需要:

    <李> 在您的系统上设置的 Node.js 开发环境。如果您使用的是 Ubuntu 22.04,请按照我们的教程如何安装 Node.js 和创建本地开发环境的选项 3 安装最新版本的 Node.js。 <李> SQLite3 安装在您的开发环境中。按照我们的教程如何在 Ubuntu 20.04 上安装和使用 SQLite 的步骤 1 进行操作。 有关如何创建表和编写 SQL 查询以检索和修改表中数据的基本知识。按照我们的教程如何在 Ubuntu 20.04 上安装和使用 SQLite 的步骤 2 到 6 进行操作。 <李> 熟悉如何编写 Node.js 程序,您可以在我们的教程中找到如何在 Node.js 中编写和运行您的第一个程序。

第 1 步 — 设置项目目录

在此步骤中,您将创建项目目录并下载 node-sqlite3 作为依赖项。

首先,使用 mkdir 命令创建一个目录。为了本教程的缘故,它被称为 sqlite_demo,但您可以将名称替换为您选择的名称之一:

  1. mkdir sqlite_demo

接下来,使用 cd 命令切换到新创建的目录:

  1. cd sqlite_demo

使用 npm 命令将项目目录初始化为 npm 包:

  1. npm init -y

该命令会创建一个 package.json 文件,其中包含项目的重要元数据。 -y 选项指示 npm 接受所有默认值。

运行命令后,屏幕上将显示以下输出:

Output
Wrote to /home/sammy/sqlite_demo/package.json: { "name": "sqlite_demo", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [], "author": "", "license": "ISC" }

输出表明 package.json 文件已创建,其中包含记录项目重要元数据的属性。一些重要的选项是:

  • name:您的项目名称。
  • version:您的项目版本。
  • main:项目的起点。

您可以保留默认选项,但可以随意修改属性值以满足您的偏好。有关属性的更多信息,请参阅 npm 的 package.json 文档。

接下来,使用 npm install 安装 node-sqlite3 包:

  1. npm install sqlite3

安装包后,输出将显示如下:

Output
added 104 packages, and audited 105 packages in 9s 5 packages are looking for funding run `npm fund` for details found 0 vulnerabilities

现在您已经安装了 node-sqlite3,您将在下一节中使用它连接到 SQLite 数据库。

第 2 步 — 连接到 SQLite 数据库

在此步骤中,您将使用 node-sqlite3 将您的 Node.js 程序连接到您将创建的 SQLite 数据库,该数据库包含不同的鲨鱼及其属性。为了建立数据库连接,node-sqlite3 包提供了一个Database 类。实例化时,该类会在您的计算机磁盘上创建一个 SQLite 数据库文件并连接到它。建立连接后,您将为您的应用程序创建一个表,在后面的部分中您将使用它来插入、检索或更新数据。

使用 nano 或您最喜欢的文本编辑器,创建并打开 db.js 文件:

  1. nano db.js

在您的 db.js 文件中,添加以下代码以建立与 SQLite 数据库的连接:

const sqlite3 = require("sqlite3").verbose();
const filepath = "./fish.db";

function createDbConnection() {
  const db = new sqlite3.Database(filepath, (error) => {
    if (error) {
      return console.error(error.message);
    }
  });
  console.log("Connection with SQLite has been established");
  return db;
}

在第一行中,将 node-sqlite3 模块导入到程序文件中。在第二行中,您将变量 filepath 设置为您希望 SQLite 数据库驻留的路径和数据库文件的名称,在本例中为 fish.db。

在下一行中,您定义了与 SQLite 数据库建立连接的 createDbConnection() 函数。在该函数中,您使用 new 关键字实例化 sqlite3.Database() 类。该类有两个参数:filepath 和一个回调。

第一个参数 filepath 接受 SQLite 数据库的名称和路径,这里是 ./fish.db。第二个参数是一个回调,一旦创建了数据库并建立了到数据库的连接就会运行。如果在尝试建立数据库连接时发生错误,则回调采用设置为 error 对象的 error 参数。在回调中,您使用 if 语句检查是否有错误。如果条件为真,则使用 console.error() 方法记录错误消息。

现在,当您使用 sqlite3.Database() 类创建一个实例时,它会在您的项目目录中创建一个 SQLite 数据库文件,并返回一个存储在 db 中的数据库对象> 变量。数据库对象提供了一些方法,您可以使用这些方法来传递创建表以及插入、检索或修改数据的 SQL 语句。

最后,您调用 console.log() 来记录一条成功消息并在 db 变量中返回数据库对象。

接下来,添加突出显示的代码以创建一个创建表的函数:

...
function createDbConnection() {
    ...
}

function createTable(db) {
  db.exec(`
  CREATE TABLE sharks
  (
    ID INTEGER PRIMARY KEY AUTOINCREMENT,
    name   VARCHAR(50) NOT NULL,
    color   VARCHAR(50) NOT NULL,
    weight INTEGER NOT NULL
  );
`);
}

createTable() 函数在 SQLite 数据库中创建一个表。它以数据库对象 db 作为参数。在 createTable() 函数中,您调用 db 数据库对象的 exec() 方法,该方法将给定的 SQL 语句发送到数据库以被执行。 exec() 方法仅用于不返回结果行的查询。

传递给 exec() 方法的 CREATE TABLE sharks... SQL 语句创建一个包含以下字段的表 sharks:

  • ID:存储INTEGER数据类型的值。 PRIMARY KEY 约束将列指定为主键,AUTOINCREMENT 指示 SQLite 自动递增表中每一行的 ID 列值。
  • name:使用最多 50 个字符的 VARCHAR 数据类型详细说明鲨鱼的名称。 NOT NULL 约束确保该字段不能存储 NULL 值。
  • color:代表鲨鱼的颜色,使用VARCHAR数据类型,最多50个字符。 NOT NULL 约束表示该字段不应接受 NULL 值。
  • weight:使用 INTEGER 数据类型存储鲨鱼的重量(以千克为单位),并使用 NOT NULL 约束来确保 NULL 值不允许。

在同一个 db.js 文件中,添加突出显示的代码以调用 createTable() 函数:

function createDbConnection() {
  const db = new sqlite3.Database(filepath, (error) => {
    if (error) {
      return console.error(error.message);
    }
    createTable(db);
  });
  console.log("Connection with SQLite has been established");
  return db;
}


function createTable(db) {
    ...
}

当回调运行时,您调用 createTable() 函数并将 db 数据库对象作为参数。

接下来,添加以下行以调用 createDbConnection() 函数:

...
function createDbConnection() {
    ...
}


function createTable(db) {
    ...
}

module.exports = createDbConnection();

在前面的代码中,您调用了 createDbConnection() 函数,它建立了与数据库的连接并返回了一个数据库对象。然后使用 module.exports 导出数据库对象,以便您可以在其他文件中引用它。

您的文件现在将包含以下内容:

const sqlite3 = require("sqlite3").verbose();
const filepath = "./fish.db";

function createDbConnection() {
  const db = new sqlite3.Database(filepath, (error) => {
    if (error) {
      return console.error(error.message);
    }
    createTable(db);
  });
  console.log("Connection with SQLite has been established");
  return db;
}

function createTable(db) {
  db.exec(`
  CREATE TABLE sharks
  (
    ID INTEGER PRIMARY KEY AUTOINCREMENT,
    name   VARCHAR(50) NOT NULL,
    color   VARCHAR(50) NOT NULL,
    weight INTEGER NOT NULL
  );
`);
}

module.exports = createDbConnection();

保存并退出您的文件。如果使用 nano,按 CTRL+X 退出,按 y 保存所做的更改,然后按 ENTER 确认文件名。

使用 node 命令运行 db.js 文件:

  1. node db.js

输出将显示数据库连接已成功建立:

Output
Connection with SQLite has been established

接下来,使用 ls 命令检查是否已创建 fish.db 数据库文件:

  1. ls
Output
db.js fish.db node_modules package-lock.json package.json

fish.db 数据库文件在输出中的出现确认数据库已成功创建。

现在,每次运行 db.js 文件时,它都会调用 createTable() 函数在数据库中创建一个表。尝试创建一个已经存在的表会触发 SQLite 抛出错误。要看到这一点,请使用 node 命令重新运行 db.js 文件:

  1. node db.js

这一次,您将收到以下输出中显示的错误:

Output
Connection with SQLite has been established undefined:0 [Error: SQLITE_ERROR: table sharks already exists Emitted 'error' event on Database instance at: ] { errno: 1, code: 'SQLITE_ERROR' } Node.js v17.6.0

错误消息表明 sharks 表已经存在。这是因为当您第一次运行 node 命令时,会创建 fish 数据库以及 sharks 表。当您重新运行命令时,createTable() 函数会第二次运行,这会触发错误,因为表已经存在。

每当您想使用数据库对象方法在其他文件中操作数据库时,也会触发此错误。例如,在下一步中,您将创建一个将数据插入数据库的文件。要使用数据库对象,您需要导入 db.js 文件并调用相关方法将数据插入数据库。当您运行该文件时,它会依次运行 db.js,这将触发相同的错误。

为了解决这个问题,您将使用 fs 模块的 existsSync() 方法来检查数据库文件 fish.db 是否存在项目目录。如果数据库文件存在,您将建立与数据库的连接,而无需调用 createTable() 函数。如果不存在,您将建立连接并调用 createTable() 函数。

为此,请再次在编辑器中打开 db.js:

  1. nano db.js

在您的 db.js 文件中,添加突出显示的代码以检查数据库文件是否存在:

const fs = require("fs");
const sqlite3 = require("sqlite3").verbose();
const filepath = "./fish.db";

function createDbConnection() {
  if (fs.existsSync(filepath)) {
    return new sqlite3.Database(filepath);
  } else {
    const db = new sqlite3.Database(filepath, (error) => {
      if (error) {
        return console.error(error.message);
      }
      createTable(db);
    });
    console.log("Connection with SQLite has been established");
    return db;
  }
}

首先,导入用于与文件系统交互的 fs 模块。其次,在添加的 if 语句中,您调用 fs.existSync() 方法来检查给定参数中的文件是否存在,即数据库文件 <代码>./fish.db 这里。如果该文件存在,则使用数据库文件路径调用 sqlite3.Database() 并忽略回调。但是,如果该文件不存在,则创建数据库实例并在回调中调用 createTable() 函数以在数据库中创建表。

此时,完整的文件现在将显示如下:

const fs = require("fs");
const sqlite3 = require("sqlite3").verbose();
const filepath = "./fish.db";

function createDbConnection() {
  if (fs.existsSync(filepath)) {
    return new sqlite3.Database(filepath);
  } else {
    const db = new sqlite3.Database(filepath, (error) => {
      if (error) {
        return console.error(error.message);
      }
      createTable(db);
    });
    console.log("Connection with SQLite has been established");
    return db;
  }
}

function createTable(db) {
  db.exec(`
  CREATE TABLE sharks
  (
    ID INTEGER PRIMARY KEY AUTOINCREMENT,
    name   VARCHAR(50) NOT NULL,
    color   VARCHAR(50) NOT NULL,
    weight INTEGER NOT NULL
  );
`);
}

module.exports = createDbConnection();

完成更改后保存并关闭文件。

为了确保 db.js 文件在多次运行时不会抛出错误,请删除带有 rm 的 fish.db 文件命令重新开始:

  1. rm fish.db

运行 db.js 文件:

  1. node db.js
Output
Connection with SQLite has been established

现在,确认 db.js 连接到数据库,并且不会尝试通过运行文件为 db.js 文件的所有后续重新运行再次创建表再次:

  1. node db.js

您现在会注意到您不会再收到错误消息。

现在您已经建立了与 SQLite 数据库的连接并创建了一个表,您将向数据库中插入数据。

第 3 步 — 将数据插入 SQLite 数据库

在此步骤中,您将使用 node-sqlite3 模块创建一个将数据插入 SQLite 数据库的函数。您会将要插入的数据作为命令行参数传递给程序。

在文本编辑器中创建并打开 insertData.js 文件:

  1. nano insertData.js

在您的 insertData.js 文件中,添加以下代码以获取命令行参数:

const db = require("./db");

function insertRow() {
  const [name, color, weight] = process.argv.slice(2);
}

在第一行中,导入在上一步中导出到 db.js 文件中的数据库对象。在第二行中,您定义函数 insertRow(),您很快就会用它来将数据插入表中。在函数中,process.argv 返回一个数组中的所有命令行参数。索引 0 上的第一个元素包含到 Node 的路径。索引 1 上的第二个元素存储 JavaScript 程序的文件名。从索引 2 开始的所有后续元素都包含您传递给文件的命令行参数。要跳过前两个参数,您可以使用 JavaScript 的 slice() 方法对数组进行浅表复制,并将索引 2 中的元素返回到数组的末尾。

接下来,添加突出显示的代码以将数据插入数据库:

const db = require("./db");

function insertRow() {
  const [name, color, weight] = process.argv.slice(2);
  db.run(
    `INSERT INTO sharks (name, color, weight) VALUES (?, ?, ?)`,
    [name, color, weight],
    function (error) {
      if (error) {
        console.error(error.message);
      }
      console.log(`Inserted a row with the ID: ${this.lastID}`);
    }
  );
}

在前面的代码中,您调用了 db.run() 方法,该方法采用三个参数:SQL 语句、数组和回调。第一个参数 INSERT INTO sharks... 是一个将数据插入数据库的 SQL 语句。 INSERT 语句中的 VALUES 语句采用逗号分隔的需要插入的值列表。请注意,您传递的是 ? 占位符,而不是直接传递值。这是为了避免 SQL 注入攻击。在执行过程中,SQLite 会自动将占位符替换为 db.run() 方法第二个参数中传递的值,该参数是一个包含命令行参数值的数组。

最后,db.run() 方法的第三个参数是一个回调,它在数据成功插入表中时运行。如果出现错误,错误消息将记录在控制台中。如果插入成功,您将记录一条成功消息,其中包含 this.lastID 返回的新插入行的 ID。

现在,添加突出显示的行以调用 insertRow() 函数:

const db = require("./db");

function insertRow() {
  const [name, color, weight] = process.argv.slice(2);
  db.run(
    `INSERT INTO sharks (name, color, weight) VALUES (?, ?, ?)`,
    [name, color, weight],
    function (error) {
      if (error) {
        console.error(error.message);
      }
      console.log(`Inserted a row with the ID: ${this.lastID}`);
    }
  );
}

insertRow();

保存并关闭文件,然后使用鲨鱼名称、颜色和重量参数运行文件:

  1. node insertData.js sammy blue 1900

输出表明该行已插入到主 ID 1 的表中:

Output
Inserted a row with the ID: 1

使用不同的参数再次运行命令:

  1. node insertData.js max white 2100
Output
Inserted a row with the ID: 2

当您运行上述命令时,将在 sharks 表中创建两行。

现在您可以将数据插入 SQLite 数据库,接下来您将从数据库中检索数据。

第 4 步 — 从 SQLite 数据库中检索数据

在这一步中,您将使用 node-sqlite3 模块检索 SQLite 数据库中 sharks 表中存储的所有数据,并将它们记录到控制台中。

首先,打开 listData.js 文件:

  1. nano listData.js

在您的 listData.js 文件中,添加以下代码以检索所有行:

const db = require("./db");

function selectRows() {
  db.each(`SELECT * FROM sharks`, (error, row) => {
    if (error) {
      throw new Error(error.message);
    }
    console.log(row);
  });
}

首先,在 db.js 文件中导入数据库对象。其次,定义 selectRows() 函数来检索 SQLite 数据库中的所有行。在该函数中,您使用数据库对象 db 的 each() 方法从数据库中逐行检索行。 each() 方法有两个参数:一个 SQL 语句和一个回调。

第一个参数 SELECT 返回 sharks 表中的所有行。第二个参数是每次从数据库检索行时运行的回调。在回调中,您检查错误。如果出现错误,您可以使用 throw 语句来创建自定义错误。如果在检索期间没有发生错误,则数据将记录在控制台中。

现在,添加突出显示的代码以调用 selectRows() 函数:

const db = require("./db");

function selectRows() {
  db.each(`SELECT * FROM sharks`, (error, row) => {
    if (error) {
      throw new Error(error.message);
    }
    console.log(row);
  });
}

selectRows();

保存并退出文件,然后运行文件:

  1. node listData.js

运行该命令后,您会注意到显示如下的输出:

Output
{ ID: 1, name: 'sammy', color: 'blue', weight: 1900 } { ID: 2, name: 'max', color: 'white', weight: 2100 }

输出显示您在上一步中插入到 sharks 表中的所有行。 node-sqlite3 模块将每个 SQL 结果转换为 JavaScript 对象。

现在您可以从 SQLite 数据库中检索数据,您将更新 SQLite 数据库中的数据。

第 5 步 — 修改 SQLite 数据库中的数据

在此步骤中,您将使用 node-sqlite3 模块更新 SQLite 数据库中的一行。为此,您将向程序传递一个命令行参数,其中包含要修改的行的主 ID,以及要将该行更新为的值。

在文本编辑器中创建并打开 updateData.js 文件:

  1. nano updateData.js

在您的 updateData.js 文件中,添加以下代码以更新记录:

const db = require("./db");

function updateRow() {
  const [id, name] = process.argv.slice(2);
  db.run(
    `UPDATE sharks SET name = ? WHERE id = ?`,
    [name, id],
    function (error) {
      if (error) {
        console.error(error.message);
      }
      console.log(`Row ${id} has been updated`);
    }
  );
}

updateRow();

首先,从 db.js 文件导入数据库对象。其次,定义更新数据库中行的 updateRow 函数。在该函数中,您将命令行参数解压缩到 id 和 name 变量中。 id 变量包含您要更新的行的主 ID,name 包含您希望名称字段反映的值。

接下来,使用以下参数调用 db.run() 函数:SQL 语句和回调。 UPDATE SQL 语句将 name 列从当前值更改为在 name 变量中传递的值。 WHERE 子句确保仅更新具有 id 变量中 ID 的行。 db.run() 方法采用第二个参数,这是一个在值更新后运行的回调。

最后,调用 updateRow() 函数。

完成更改后保存并关闭文件。

使用要更改的行的 id 和新的 name 运行 updateData.js 文件:

  1. node updateData.js 2 sonny
Output
Row 2 has been updated

验证名称是否已更改:

  1. node listData.js

当您运行该命令时,您的输出将类似于以下内容:

Output
{ ID: 1, name: 'sammy', color: 'blue', weight: 1900 } { ID: 2, name: 'sonny', color: 'white', weight: 2100 }

输出表明 ID 为 2 的行现在将 sonny 作为其 name 字段的值。

有了它,您现在可以更新数据库中的一行。接下来,您将从 SQLite 数据库中删除数据。

第 6 步 — 删除 SQLite 数据库中的数据

在本节中,您将使用 node-sqlite3 从 SQLite 数据库的表中选择和删除一行。

在文本编辑器中创建并打开 deleteData.js 文件:

  1. nano deleteData.js

在您的 deleteData.js 文件中,添加以下代码以删除数据库中的一行:

const db = require("./db");

async function deleteRow() {
  const [id] = process.argv.slice(2);
  db.run(`DELETE FROM sharks WHERE id = ?`, [id], function (error) {
    if (error) {
      return console.error(error.message);
    }
    console.log(`Row with the ID ${id} has been deleted`);
  });
}

deleteRow();

首先,在 db.js 文件中导入数据库对象。其次,定义用于删除表 sharks 中的行的 deleteRow()。在该函数中,您解压缩主键 ID 并将其存储在 id 变量中。接下来,调用 db.run(),它有两个参数。第一个参数是 SQL 语句 DELETE from sharks...,它删除表 sharks 中的一行。 WHERE 子句确保仅删除具有 id 变量中 ID 的行。第二个参数是在行被删除后运行的回调。如果成功,该函数会记录一条成功消息;否则,它会在控制台中记录错误。

最后,调用 deleteRow() 函数。

保存并关闭文件,然后运行以下命令:

  1. node deleteData.js 2
Output
Row with the ID 2 has been deleted

接下来,确认该行已被删除:

  1. node listData.js

当您运行该命令时,您的输出将显示类似于以下内容:

Output
{ ID: 1, name: 'sammy', color: 'blue', weight: 1900 }

ID 为 2 的行不再出现在结果中。这确认该行已被删除。

这样,您现在可以使用 node-sqlite3 模块删除 SQLite 数据库中的行。

结论

在本文中,您创建了一个 Node.js 应用程序,它使用 node-sqlite3 模块连接到 SQLite 数据库并在其中创建一个表。接下来,您修改了应用程序以在数据库中插入、检索和更新数据。最后,您修改了应用程序以删除数据库中的数据。

要深入了解 node-sqlite3 方法,请访问如何在 Node.js 中编码系列。

©2015-2025 艾丽卡 support@alaica.com