mysql2/promise 中 execute 和 query 的使用最佳实践
作者:清风细雨_林木木
mysql2/promise中,execute使用预处理语句,严格类型检查且防SQL注入,适合频繁执行,query直接拼接SQL,参数绑定更宽松,适用于简单查询,LIMIT/OFFSET在query中不会报错,execute需拼接数字常量,本文给大家介绍mysql2/promise中execute和query的使用,感兴趣的朋友一起看看吧
mysql2/promise 中 execute 和 query 的使用
1.executevsquery
| 方法 | 原理 | 特点 |
|---|---|---|
db.execute() | 使用 Prepared Statement (预处理语句) | 参数严格类型检查,性能稳定,防 SQL 注入 |
db.query() | 直接拼接 SQL 发送给 MySQL 执行 | 参数绑定更宽松,对 LIMIT/OFFSET 不会类型检查 |
2. 为什么query可以?
因为 query 方法:
- 不走 prepare + execute 两阶段过程
- 而是 一次性发送完整 SQL(即使你用
?占位符,也只是 Node.js 侧简单替换后拼接),
所以,下面代码对 query 来说是可行的:
const sql = `SELECT * FROM dictionary ${searchQuery} ORDER BY id ASC LIMIT ? OFFSET ?`;
const [results] = await db.query(sql, [...searchParams, Number(pageSize), Number(offset)]);3. 什么时候使用 query?
- 语句不需要重复执行、对性能要求不极致时,可用
query,代码更宽容。 - 如果
LIMIT、OFFSET参数会报错,换query可以快速解决。
4. 什么时候使用 execute?
- 当
SQL 需要频繁执行(如同一个查询反复调用),使用execute结合 Prepared Statement 可以提升性能。 - 需要严格防 SQL 注入时,优先
execute,但在LIMIT/OFFSET场景需改成拼接数字。
5. 最佳实践
查询数据
const sql = `SELECT * FROM table LIMIT ${Number(limit)} OFFSET ${Number(offset)}`;
const [rows] = await db.execute(sql, params);
// 或者
const [rows] = await db.query(sql, params);更新/插入
const [result] = await db.execute('INSERT INTO user(name) VALUES(?)', [name]);总结
query 在 LIMIT/OFFSET 场景下可直接使用,不会出现 Incorrect arguments to mysqld\_stmt\_execute 错误
如果使用 execute,LIMIT/OFFSET 需拼接数字常量
到此这篇关于mysql2/promise 中 execute 和 query 的使用最佳实践的文章就介绍到这了,更多相关mysql execute 和 query使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
您可能感兴趣的文章:
- MySQL execute、executeUpdate、executeQuery三者的区别
- python中pymysql的executemany使用方式
- The MySQL server is running with the --read-only option so it cannot execute this statement
- MySQL中预处理语句prepare、execute与deallocate的使用教程
- MySQL报错Lost connection to MySQL server during query的解决方案
- mysql慢查询日志分析工具使用(pt-query-digest)
- MySQL query_cache_type 参数与使用详解
