mysql
和 mysql2
都是 Node.js 中常用的操作 MySQL 数据库的模块,它们的主要区别是在实现方式上略有不同。
mysql
:是 Node.js 中比较早期的 MySQL 操作模块,该模块底层使用的是回调函数(callback)来实现异步操作。在处理大量并发请求时,由于回调函数的嵌套会导致代码难以维护、阅读和调试,因此在性能和可维护性上都有一定的劣势。此外, mysql
模块在连接池等方面的表现也较为一般。
mysql2
:是 mysql
模块的替代品,该模块使用 Promise 和回调函数(callback)两种方式来实现异步操作,因此在性能和可维护性上都具有优势。此外,mysql2
模块还新增了支持多语句查询、预处理语句等功能,提供了更丰富的 API,使用起来更方便。
因此,在实际开发中,建议使用 mysql2
模块来操作 MySQL 数据库,它相对于 mysql
模块更加稳定、灵活、易用。当然,如果使用的是较老的版本,可能需要依赖 mysql
模块,但这种情况下需要自己承担潜在的风险和限制。
例如:使用mysql时:一般是这样用:而不是Promise的方式
db.query(sql, req.params.id, (err, results) => {
if (err) return res.cc(err)
if (results.length !== 1) return res.cc("获取对应文章失败!")
res.send({
status: 0,
message: "获取对应文章分别成功!",
data: results[0]
})
})
且在相应的db文件夹下的index.js文件中应该这样写
const mysql = require("mysql")
const db = mysql.createPool({
host: "127.0.0.1",
user: 'root',
password: "123456",
database: "my_db_01"
})
//用db进行操作的
module.exports = db
而使用mysql2时,一般是通过promise的方式使用db
try {
const [rows, r] = await db.query(`select Id,username,id from ev_users`)
console.log(rows)
// console.log(r)
res.send({
status: 0,
message: "获取用户列表成功!",
data: rows
})
} catch (e) {
res.send({
status: 1,
message: "获取用户列表数据失败!",
desc: e.message
})
}
并且index.js文件一般都得这样写:注意export的是 pool.promise()!!!!!
import mysql from "mysql2"
const pool = mysql.createPool({
host: "127.0.0.1",
// port: 3306,
database: "my_db_01",
user: "root",
password: "123456"
})
// export default pool.promise()
export default pool.promise()
如果只写pool的话,会报错:
object is not iterable (cannot read property Symbol(Symbol.iterator))
当然了像下面写不会报错,但是得到的结果却也不是我们想要的
const rows = db.query(`select Id,username,id from ev_users`)
console.log(rows)
// console.log(r)
res.send({
status: 0,
message: "获取用户列表成功!",
data: rows
})
只是将上面的[rows,r]改成了rows 变成了不迭代的形式 但是得到的结果是这个: