MySQL 是一种广泛使用的数据库管理系统,许多应用程序都使用它来存储和管理数据。在 Node.js 中,使用 MySQL 实现 CRUD 操作是非常常见的。掌握 Node.js MySQL CRUD 可以让你轻松创建和管理 Web 应用程序,这对于想要在后端开发领域取得成功的人来说是必不可少的技能。

本篇笔记提供了使用 Node.js 包 mysql2 读写 MySQL 的详细示例和关键步骤。在示例中,我们主要关注以下方面:

  • 如何建立和关闭 MySQL 的连接
  • 如何插入记录
  • 如何读取记录
  • 如何更新记录
  • 如何删除记录

希望可以帮助你更好地理解使用 mysql2 包进行 MySQL 访问的过程。

mysql2

Node.js 访问 MySQL 时常用的包是 mysql,不过这个库目前尚不支持 MySQL 8.0;替代方案是使用库 mysql2,文档显示两者之间绝大多数的 API 是兼容的。

安装库 mysql2:

npm install mysql2

创建/关闭数据库连接

import mysql from "mysql2";

const connection = mysql.createConnection({
  host: Config.mysql_host,
  port: Config.mysql_port,
  user: Config.mysql_user,
  password: Config.mysql_password,
  database: Config.mysql_db_example,
});

connection.connect();

......

connection.end();

MySQL 连接属性:

  • IP 地址或域名(Config.mysql_host)
  • 端口(Config.mysql_port)
  • 用户名(Config.mysql_user)
  • 密码(Config.mysql_password)
  • 数据库名称(Config.mysql_db_example)

Config.* 可替换成具体的值。

创建连接

connection.connect();

关闭连接

connection.end();

数据表

假设数据库 example 中存在一张名称为 user 的数据表,创建表语句:

CREATE TABLE `user` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(128) NOT NULL DEFAULT '',
  `age` int NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  UNIQUE KEY `name_UNIQUE` (`name`)
);

插入记录

插入一行记录

function createRow() {
  const sql = "INSERT INTO user (name, age) VALUES (?, ?)";
  const values = ["userA", 1];

  connection.query(sql, values, (error, results) => {
    if (error) {
      throw error;
    }

    // 获取插入记录的行数
    console.log("insert rows:", results.affectedRows);
    // 获取插入记录的自增 ID
    console.log("insert row id:", results.insertId);
  });
}

插入记录是通过 connection.query 方法实现的,方法参数:

  • SQL 语句(sql)
  • SQL 参数值列表(values,可选)
  • 回调函数((error, results) => {})

读取、更新和删除记录也是通过 connection.query 方法实现的。

注意:如果 SQL 语句中包含有参数,则 SQL 语句中的参数占位符(?)要和 SQL 参数值列表中的参数值一一对应。

回调函数含有两个参数:errorresults。如果参数 error 不为 null,表示插入错误。可以使用 results.affectedRows 获取插入成功的记录数目(这里的值为1);如果数据表含有自增 ID,也可以使用 results.insertId 获取已插入记录的 ID 值。

插入多行记录

function createRows() {
  const sql = "INSERT INTO user (name, age) VALUES ?";
  const values = [
    [
      ["userB", 2],
      ["userC", 3],
      ["userD", 4],
    ],
  ];

  connection.query(sql, values, (error, results) => {
    if (error) {
      throw error;
    }

    // 获取插入记录的行数
    console.log("insert rows:", results.affectedRows);
  });
}

插入多行记录和插入一行记录实质上是一样的,需要注意的是多行记录场景下参数占位符和参数列表的使用,更多内容可以参考 Escaping query values

读取记录

function readRows() {
  const sql = "SELECT id, name, age from user WHERE id = ? OR name = ?";
  const values = [1, "userB"];

  connection.query(sql, values, (error, results, fields) => {
    if (error) {
      throw error;
    }

    console.log("read rows:", results.length);

    results.forEach((row) => {
      const id = row.id;
      const name = row.name;
      const age = row.age;

      console.log(`id: ${id}, name: ${name}, age: ${age}`);
    });

    const names = fields.map((field) => field.name);
    console.log("column names:", names);
  });
}

读取记录的场景下,results 是一个数组,数组的一个元素就是一行记录。可以通过 results.length 获取读取的记录数目;通过遍历 results 获取每一行记录,每一行记录都是一个 Object,可以通过列名获取每一列的值。

读取记录的回调函数有一个特殊的参数 fields,它包含着记录的列信息,如:列名。

更新记录

function updateRows() {
  const sql = "UPDATE user SET age = ? WHERE name = ?";
  const values = [40, "userD"];

  connection.query(sql, values, (error, results) => {
    if (error) {
      throw error;
    }

    // 获取更新记录的行数
    console.log("update rows:", results.changedRows);
  });
}

更新记录和插入记录类似,如果需要获取更新记录的行数,可以通过 results.changedRows

关于 affectedRowschangedRows 的区别可以参考:Getting the number of affected rowsGetting the number of changed rows

删除记录

function deleteRows() {
  const sql = "DELETE FROM user WHERE age = ?";
  const values = [40];

  connection.query(sql, values, (error, results) => {
    if (error) {
      throw error;
    }

    // 获取删除记录的行数
    console.log("delete rows:", results.affectedRows);
  });
}

删除记录和更新记录类似,不再赘述。

results matching ""

    No results matching ""