Nodejs使用mysql2操作数据库【完备解说】

打印 上一主题 下一主题

主题 984|帖子 984|积分 2962

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
mysql2 相比于 mysql 的上风

mysql2 是一个基于 Node.js 的 MySQL 客户端库,相比于 mysql 库,它具有以下几个上风:

  • 性能更好:mysql2 库在性能方面进行了优化,使用了更高效的底层实现。它使用了更快的连接池管理和查询执行机制,可以处置惩罚更高的并发请求,提供更好的性能表现。
  • 支持 Promise 和 async/await:mysql2 库原生支持 Promise 和 async/await,使得编写异步代码更加方便和直观。您可以使用 promise().query() 方法执行查询,并使用 await 关键字等候查询结果。
  • 支持流式查询:mysql2 库支持流式查询,可以通过创建可读流来处置惩罚大型查询结果集。这对于处置惩罚大量数据或需要逐行处置惩罚结果的情况非常有用,可以减少内存占用并进步性能。
  • 更好的错误处置惩罚:mysql2 库提供了更好的错误处置惩罚机制,可以更详细地捕获和处置惩罚数据库操作中的错误。它返回的错误对象包含更多有用的信息,如 SQL 语句、错误代码和错误堆栈等,有助于更好地调试和排查问题。
  • 支持预处置惩罚语句:mysql2 库支持预处置惩罚语句,可以使用占位符来安全地构建和执行 SQL 查询。这可以防止 SQL 注入攻击,并进步应用程序的安全性。
安装

  1. npm install mysql2
复制代码
连接数据库

要使用 mysql2 连接到 MySQL 数据库,您需要安装 mysql2 包,并使用适当的连接参数来创建连接。以下是一个示例,展示了怎样使用 mysql2 连接到 MySQL 数据库:
  1. const mysql = require("mysql2");
  2. // 创建数据库连接
  3. const connection = mysql.createConnection({
  4.   host: "localhost", // 主机地址
  5.   user: "root", // 用户名
  6.   password: "password", // 密码
  7.   port: 3306, // 端口号,默认为 3306
  8.   database: "mydatabase", // 数据库名称
  9.   charset: "UTF8_GENERAL_CI", // 连接字符集,默认为 UTF8_GENERAL_CI
  10.   connectTimeout: 10000, // 连接超时时间,单位为毫秒
  11.   multipleStatements: false // 是否允许一个 query 中有多个 MySQL 语句,默认为 false
  12. });
  13. // 连接到数据库
  14. connection.connect((err) => {
  15.   if (err) {
  16.     console.error("Error connecting to database:", err);
  17.     return;
  18.   }
  19.   console.log("Connected to database");
  20.   
  21.   // 在这里执行数据库操作
  22. });
  23. // 在数据库连接关闭时触发
  24. connection.on("end", () => {
  25.   console.log("Database connection closed");
  26. });
  27. // 在发生错误时触发
  28. connection.on("error", (err) => {
  29.   console.error("Database error:", err);
  30. });
  31. // 关闭数据库连接
  32. connection.end();
复制代码
在这个示例中,我们使用 mysql.createConnection() 方法创建了一个数据库连接,并传递了连接参数(主机名、用户名、密码和数据库名称)。然后,我们使用 connection.connect() 方法来连接到数据库。
在连接乐成后,您可以在回调函数中执行数据库操作。在这个示例中,我们只是简单地输出连接乐成的消息,但您可以在这里执行任何数据库操作,如查询、插入、更新等。
请注意,为了确保数据库连接的精确关闭,我们监听了 end 事件,并在事件处置惩罚程序中关闭了连接。别的,我们还监听了 error 事件,以处置惩罚可能发生的数据库错误。
最后,我们使用 connection.end() 方法来关闭数据库连接。
请根据您的现真相况修改连接参数,以适应您的 MySQL 数据库的设置。
通过 query() 方法执行SQL语句

连接数据库之后,可以使用query()方法对数据库进行增编削查操作。
详细的语法格式:connection.query(sql,params,callback),以下是对 query() 方法的参数进行详细分析:


  • sql:要执行的 SQL 查询语句,可以是 SELECT、INSERT、UPDATE、DELETE 等。
  • params(可选):一个数组,包含要传递给 SQL 查询的参数。这些参数可以用于预处置惩罚语句中的占位符。
  • callback:一个回调函数,用于处置惩罚查询结果或错误。回调函数吸收两个参数:err 和 results。err 是一个错误对象(假如有错误发生),results 是查询结果。
以下是一个示例,展示了怎样使用 query() 方法执行 SQL 查询并处置惩罚结果:
  1. const mysql = require("mysql2");
  2. // 创建数据库连接
  3. const connection = mysql.createConnection({
  4.   host: "localhost",
  5.   user: "root",
  6.   password: "password",
  7.   database: "mydatabase"
  8. });
  9. // 连接到数据库
  10. connection.connect((err) => {
  11.   if (err) {
  12.     console.error("Error connecting to database:", err);
  13.     return;
  14.   }
  15.   console.log("Connected to database");
  16.   // 执行 SQL 查询,可以用??代替表名、字段、索引名;用?代替数据。
  17.   const sql = "SELECT * FROM users WHERE age > ?";
  18.   const params = [18];
  19.   connection.query(sql, params, (err, results) => {
  20.     if (err) {
  21.       console.error("Error executing query:", err);
  22.       return;
  23.     }
  24.     console.log("Query results:", results);
  25.   });
  26. });
  27. // 在数据库连接关闭时触发
  28. connection.on("end", () => {
  29.   console.log("Database connection closed");
  30. });
  31. // 在发生错误时触发
  32. connection.on("error", (err) => {
  33.   console.error("Database error:", err);
  34. });
  35. // 关闭数据库连接
  36. connection.end();
复制代码
在这个示例中,我们执行了一个 SELECT 查询,查找年事大于 18 的用户。我们使用了预处置惩罚语句,并将参数 [18] 传递给 query() 方法。
在回调函数中,我们处置惩罚了查询结果或错误。假如查询乐成,我们打印出查询结果 results。
请根据您的现实需求修改 SQL 查询语句、参数和处置惩罚逻辑。您可以执行任何有用的 SQL 查询,并根据需要处置惩罚查询结果或错误。
通过 execute() 方法执行SQL语句

以下是一个使用mysql2模块执行SQL查询的示例:
  1. const mysql = require('mysql2');
  2. // 创建数据库连接
  3. const connection = mysql.createConnection({
  4.   host: 'localhost',
  5.   user: 'root',
  6.   password: 'password',
  7.   database: 'mydatabase'
  8. });
  9. // 执行SQL查询
  10. connection.execute(
  11.   'SELECT * FROM users WHERE age > ?',
  12.   [18],
  13.   function(err, results, fields) {
  14.     if (err) {
  15.       console.log('[SELECT ERROR] - ', err.message);
  16.       return;
  17.     }
  18.     console.log(results);
  19.     // console.log(fields);
  20.   }
  21. );
  22. // 关闭数据库连接
  23. connection.end();
复制代码
在这个例子中,我们创建了一个名为mydatabase的数据库连接,并执行了一个查询语句,查找年事大于18岁的用户。假如查询乐成,结果将会在控制台打印出来。你可以取消注释掉console.log(fields)这行代码来检察字段信息。
请确保将localhost、root、password和mydatabase替换为你本身的数据库连接信息。
execute()和query()之间的区别:

下面是execute()和query()之间的区别:

  • 参数化查询:execute()方法支持参数化查询,可以使用占位符(比方?)来代替查询中的参数,而query()方法不支持参数化查询,需要通过字符串拼接来传递参数。
  • 回调函数:execute()和query()方法都接受一个回调函数作为参数,用于处置惩罚查询结果。但是,execute()方法的回调函数有三个参数(err, results, fields),分别表现错误信息、查询结果和字段信息;而query()方法的回调函数有两个参数(err, results),只表现错误信息和查询结果。
  • 错误处置惩罚:在execute()方法中,需要手动处置惩罚错误,通过判断err参数是否存在来确定是否有错误发生。而query()方法会主动处置惩罚错误,假如发生错误,会将错误信息传递给回调函数的err参数。
  • 返回结果:无论是execute()还是query()方法,都会返回一个结果集对象。但是,execute()方法返回的结果集对象中包含更多的信息,如受影响的行数等。
  • 预编译:execute()方法支持预编译,可以提前编译SQL语句,以进步执行效率。而query()方法不支持预编译。
连接池

通过重新使用以前的连接,连接池可以保持打开状态,从而减少连接到MySQL服务器的时间。在Node.js中,可以使用mysql.createPool()方法来创建连接池。它的语法格式如下:
  1. const mysql = require('mysql2');
  2. // 创建连接池
  3. const pool = mysql.createPool({
  4.     host: 'localhost',
  5.     user: 'root',
  6.     password: 'password',
  7.     database: 'mydatabase',
  8.     connectionLimit: 10, // 最大连接数
  9.     queueLimit: 0, // 排队等待连接的最大请求数,0表示无限制
  10.     waitForConnections: true // 当连接池达到最大连接数时,是否等待可用连接
  11. });
复制代码
使用连接池进行数据库操作可以使用pool.query()和pool.execute()方法,也可以手动获取连接进行操作。下面是使用连接池进行数据库操作的示例代码:
使用pool.query()方法:

  1. const mysql = require('mysql2');
  2. // 创建连接池
  3. const pool = mysql.createPool({
  4.     host: 'localhost',
  5.     user: 'root',
  6.     password: 'password',
  7.     database: 'mydatabase',
  8.     connectionLimit: 10
  9. });
  10. // 使用pool.query()方法执行查询
  11. pool.query('SELECT * FROM users', function(err, results, fields) {
  12.     if (err) {
  13.         console.log('[QUERY ERROR] - ', err.message);
  14.         return;
  15.     }
  16.     console.log(results);
  17. });
  18. // 关闭连接池
  19. pool.end();
复制代码
使用pool.execute()方法:

  1. const mysql = require('mysql2');
  2. // 创建连接池
  3. const pool = mysql.createPool({
  4.     host: 'localhost',
  5.     user: 'root',
  6.     password: 'password',
  7.     database: 'mydatabase',
  8.     connectionLimit: 10
  9. });
  10. // 使用pool.execute()方法执行查询
  11. pool.execute('SELECT * FROM users', function(err, results, fields) {
  12.     if (err) {
  13.         console.log('[EXECUTE ERROR] - ', err.message);
  14.         return;
  15.     }
  16.     console.log(results);
  17. });
  18. // 关闭连接池
  19. pool.end();
复制代码
手动获取连接进行数据库操作:

  1. const mysql = require('mysql2');
  2. // 创建连接池
  3. const pool = mysql.createPool({
  4.     host: 'localhost',
  5.     user: 'root',
  6.     password: 'password',
  7.     database: 'mydatabase',
  8.     connectionLimit: 10
  9. });
  10. // 从连接池中获取连接
  11. pool.getConnection(function(err, connection) {
  12.     if (err) {
  13.         console.log('[CONNECTION ERROR] - ', err.message);
  14.         return;
  15.     }
  16.     // 执行查询操作
  17.     connection.query('SELECT * FROM users', function(err, results, fields) {
  18.         connection.release(); // 释放连接回连接池
  19.         if (err) {
  20.             console.log('[QUERY ERROR] - ', err.message);
  21.             return;
  22.         }
  23.         console.log(results);
  24.     });
  25. });
  26. // 关闭连接池
  27. pool.end();
复制代码
使用 Promise

在之前通过query()和execute()操作数据库时都是通过回调函数的情势获取放返回的数据。而我们可以使用Promise将异步转化为同步使用Promise来实现异步操作可以通过async/await和promise()函数两种方式。


  • 一种是通过 async\await 来实现,
  • 种是通过 promise() 函数来实现。
下面是使用async/await和createConnection()、createPool()的方式创建数据库操作的示例代码:
使用async/await和createConnection()的方式:

  1. const mysql = require('mysql2');
  2. // 创建连接
  3. const connection = mysql.createConnection({
  4.     host: 'localhost',
  5.     user: 'root',
  6.     password: 'password',
  7.     database: 'mydatabase'
  8. });
  9. // 封装查询函数
  10. function query(sql) {
  11.     return new Promise((resolve, reject) => {
  12.         connection.query(sql, function(err, results, fields) {
  13.             if (err) {
  14.                 reject(err);
  15.             } else {
  16.                 resolve(results);
  17.             }
  18.         });
  19.     });
  20. }
  21. // 使用async/await进行数据库操作
  22. async function fetchData() {
  23.     try {
  24.         const results = await query('SELECT * FROM users');
  25.         console.log(results);
  26.     } catch (err) {
  27.         console.log('[QUERY ERROR] - ', err.message);
  28.     } finally {
  29.         connection.end();
  30.     }
  31. }
  32. fetchData();
复制代码
使用async/await和createPool()的方式:

  1. const mysql = require('mysql2');
  2. // 创建连接池
  3. const pool = mysql.createPool({
  4.     host: 'localhost',
  5.     user: 'root',
  6.     password: 'password',
  7.     database: 'mydatabase',
  8.     connectionLimit: 10
  9. });
  10. // 封装查询函数
  11. function query(sql) {
  12.     return new Promise((resolve, reject) => {
  13.         pool.query(sql, function(err, results, fields) {
  14.             if (err) {
  15.                 reject(err);
  16.             } else {
  17.                 resolve(results);
  18.             }
  19.         });
  20.     });
  21. }
  22. // 使用async/await进行数据库操作
  23. async function fetchData() {
  24.     let connection;
  25.     try {
  26.         connection = await pool.promise().getConnection();
  27.         const results = await connection.query('SELECT * FROM users');
  28.         console.log(results);
  29.     } catch (err) {
  30.         console.log('[QUERY ERROR] - ', err.message);
  31.     } finally {
  32.         if (connection) {
  33.             connection.release();
  34.         }
  35.         pool.end();
  36.     }
  37. }
  38. fetchData();
复制代码
使用promise()函数和createConnection()的方式:

  1. const mysql = require('mysql2');
  2. // 创建连接
  3. const connection = mysql.createConnection({
  4.     host: 'localhost',
  5.     user: 'root',
  6.     password: 'password',
  7.     database: 'mydatabase'
  8. });
  9. // 封装查询函数
  10. function query(sql) {
  11.     return new Promise((resolve, reject) => {
  12.         connection.query(sql, function(err, results, fields) {
  13.             if (err) {
  14.                 reject(err);
  15.             } else {
  16.                 resolve(results);
  17.             }
  18.         });
  19.     });
  20. }
  21. // 使用promise()函数进行数据库操作
  22. query('SELECT * FROM users')
  23.     .then(results => {
  24.         console.log(results);
  25.     })
  26.     .catch(err => {
  27.         console.log('[QUERY ERROR] - ', err.message);
  28.     })
  29.     .finally(() => {
  30.         connection.end();
  31.     });
复制代码
无论是使用async/await还是promise()函数,都可以将异步操作转化为同步的方式来完成对数据库的操作。根据个人的喜好和项目需求,选择得当的方式来使用Promise。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

来自云龙湖轮廓分明的月亮

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表