# 连接 MySQL 步骤

  • 安装操作 MySQL 数据库的第三方模块(mysql)
  • 通过 mysql 模块连接到 MySQL 数据库
  • 通过 mysql 模块执行 SQL 语句

# 安装 MySQL 模块

  • mysql 模块是托管于 npm 上的第三方模块。它提供了在 Node.js 项目中连接和操作 MySQL 数据库的能力。
npm install mysql

# 配置 MySQL 模块

  • 在使用 mysql 模块操作 MySQL 数据库之前,必须先对 mysql 模块进行必要的配置,主要的配置步骤如下
// 1. 导入 mysql 模块
const mysql = require('mysql')
// 2. 建立与 MySQL 数据库连接
const db = mysql.createPool({
  host: 'localhost',   // 数据库的 IP 地址
    
  port: 3306, 		   // 端口号
  user: 'root',        // 登录数据库的账号
  password: '2333',    // 登录数据库的密码
    
  database: 'my_db_01' // 指定要操作的数据库
})
  • 具体配置参考: Node.js 连接 MySQL | 菜鸟教程 (runoob.com)

# 测试连接是否成功

db.query('select 0', (err, results) => {
  //mysql 模块报错 
  if (err) return console.log(err.message);
    
  // 只要能答应出 [RowDataPacket { '0': 0} ] 就证明数据库连接正常
  console.log(results);
})

# 连接发生的错误

  • ER_NOT_SUPPORTED_AUTH_MODE Client does not support authentication protocol...

  • ER_ACCESS_DENIED_ERROR: Access denied for user 'root'@'localhost' (using password: YES)

  • 当发生类似上面的错误时,可以参考

    • https://blog.csdn.net/leilei__66/article/details/110674462
    • https://blog.csdn.net/OCEAN_C/article/details/89719578
  • 具体代码如下

cmd
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
cmd
FLUSH PRIVILEGES;

## 查询数据

  • 查询 users 表的所有数据
db.query(`select * from users`, (err, results, fields) => {
  if (err) return console.log(err);
  // 如果执行的时 select 查询语句, 则执行的结果是数组 
  console.log(results);
})

# 插入数据

# 占位符方式

  • users 表插入数据
// 1. 需要插入到 users 表的数据对象
const user = { username: 'saber', password: '12345' }
// 2. 定义 SQL 语句 其中 英文?表示占位符
const sqlStr = 'insert into users (username, password) values(?, ?)'
// 3. 执行 SQL 语句 使用数组形式依次为?占位符指定具体值
db.query(sqlStr, [...Object.values(user)], (err, results) => {
  if (err) return console.log(err); // 失败
  // 4. 如果执行的时 select 查询语句, 则执行的结果是数组 
  if (results.affectedRows === 1) 
    console.log('Data Is inserted successfully.');
})

# 便携方式

  • 向表中新增数据时,如果数据对象的每个属性和数据表的字段一一对应,如下方式快速插入数据:
// 1. 需要插入到 users 表的数据对象
const user = { username: '樱岛麻衣', password: 'YDMY' }
// 2. 定义 SQL 语句 
const sqlStr = 'insert into users set ?'
// 3. 执行 SQL 语句 使用数组形式依次为?占位符指定具体值
db.query(sqlStr, user, (err, results) => {
  if (err) return console.log(err); // 失败
  // 4. 如果执行的时 select 查询语句, 则执行的结果是数组 
  if (results.affectedRows === 1)
    console.log('Data Is inserted successfully.');
})

# 更新数据

# 占位符方式

  • 更新 users 表中已有的数据
// 更新的数据 注意 更新需要原来的数据有 id 为 1 的值才能进行更新
const user = { username: '稚名真白', password: 'ZMZB', id: 1 }
// 定义 SQL 语句
const sqlStr = 'update users set username=?, password=? where id=?'
// 执行 SQL 语句
db.query(sqlStr, [...Object.values(user)], (err, results) => {
  if (err) return console.log(err);
  // 注意 执行了 update 语句后,执行结果也是一个对象 可以通过 affectedRows 判断是否更新成功
  if (results.affectedRows === 1)
    console.log('Data updated successfully.');
})

# 便携方式

  • 更新表数据时,如果数据对象的每个属性和数据表的字段一一对应,如下方式快速更新表数据
// 更新的数据 注意 更新需要原来的数据有 id 为 1 的值才能进行更新
const user = { username: '稚名真白', password: 'ZMZB', id: 1 }
// 定义 SQL 语句
const sqlStr = 'update users set ? where id=?'
// 执行 SQL 语句
db.query(sqlStr, [user, user.id], (err, results) => {
  if (err) return console.log(err);
  if (results.affectedRows === 1)
    console.log('Data updated successfully.');
})

# 删除数据

  • 在删除数据时,推荐使用唯一标识如 id 这样的,来删除对应的数据。
// 删除 id 为 1 的用户
const sqlStr = `delete from users where id=?`
db.query(sqlStr, 1, (err, results) => {
  if (err) return console.log(err);
  // 注意 执行 delete 语句之后 结果也是一个对象, 也包含 affectedRows 属性
  if (results.affectedRows === 1)
    console.log('Data deleted successfully.')
})

# 标记删除

  • 使用 DELETE 语句,会把真正的把数据从表中删除掉。为了保险起见, 推荐使用 标记删除的形式,来 模拟删除的动作
  • 所谓的标记删除,就是在表中设置类似于 status 这样的 状态字段 ,来 标记 当前这条数据是否被删除。
  • 当用户执行了删除的动作时,我们并没有执行 DELETE 语句把数据删除掉,而是执行了 UPDATE 语句,将这条数据对应的 status 字段标记为删除即可。
// 标记删除
const sqlStr = 'update users set status=? where id=?'
// 将 id 为 1 的用户 标记删除 
db.query(sqlStr, [1, 1], (err, results) => {
  if (err) return console.log(err)
  if (results.affectedRows === 1)
    console.log('Data marker deleted successfully.');
})
Update on Views times

Give me a cup of [coffee]~( ̄▽ ̄)~*

Nico Niconi WeChat Pay

WeChat Pay

Nico Niconi Alipay

Alipay