Python MySQLdb 执行 SQL 语句的参数传递方式与最佳实践
本文详解 Python 中使用 MySQLdb 执行 SQL 语句时的参数传递方法。对比直接拼接字符串与使用 %s 占位符的区别,重点介绍字典(dict)传参的优势,并指出 %s 无需引号且能防止 SQL 注入的关键细节,帮助开发者编写更安全、可维护的代码。
MySQLdb 参数传递概述
在使用 MySQLdb 连接数据库并执行 SQL 语句时,主要存在以下几种传递参数的方法。
1. 不传递参数
conn = MySQLdb.connect(user="root",passwd="123456",host="192.168.101.23",db="cmdb")
orange_id = 98
sql = "select * from orange where id=%s" % orange_id
cursor = conn.cursor(sql)
cursor.execute()
基本参数传递方法
2. 传递参数
color = "yellow" sql = "select * from orange where color = %s"
cursor.execute(sql, color)
需要注意,此处的占位符统一使用 %s,无论传入的是字符串、数字还是其他数据类型,均使用此占位符。
此外,%s 不能添加引号,例如写成 '%s' 是错误的写法。
这与第一种写法有何区别?
两者的核心区别在于变量的解析机制:
第一种写法使用百分号 %,由 Python 解释器对 %s 执行字符串替换。这种方法存在安全隐患,有时无法正确解析包含特殊字符的内容,甚至可能导致 SQL 注入攻击风险。
第二种方式中,变量作为 execute 方法的参数传入,由 MySQLdb 内部方法将变量解释为合适的内容。
通常情况下,建议使用第二种方法,即将变量作为参数传递给 execute 函数。
字典类型传参优势
3. 使用字典(dict)类型传递参数
sql = "select * from orange where %(color)s, %(weight)s"
values = {"color": "yellow", "weight": 30}
cursor.execute(sql, values)
这种方式下,传递的参数与占位符的对应关系更加清晰。特别是在参数较多的情况下,使用字典可以确保参数传递顺序的正确性。
pymysql 动态传参补充
补充知识:Python 自动化中 pymysql 库使用变量向 SQL 语句动态传递参数(SQL 注入防范与传参策略)
在使用 Python 3 连接 MySQL 实现自动化增删查改操作时,由于项目需求,许多 SQL 语句过于复杂,导致传递的参数数量多且容易变动。这常使开发者不知如何动态传递参数,部分人采用笨拙的字符串拼接方式,不仅工作量大,复杂语句拼接时还容易出错且难以维护。因此,这里整理 %s 占位符结合字典传参的用法。
import pymysql
db = pymysql.connect(host="119.XX.XX.XX",
port=3306,
user="XXXXXXXX",
passwd="XXXXXXXXXXXXX",
db="XXXXXX",
charset='utf8')
# %s 占位符为需要传递的参数,切记不要加''双引号,要不然会报错
sql = "SELECT totalusercount * 1.4 FROM mm_project_uv_outdoor WHERE poiid = %s AND currenttime = %s"
cursor = db.cursor()
# 以下为传递多个参数的用法
cursor.execute(sql,['B00140N5CS','2019-04-23'])
# 传递单个参数时 cursor.execute(sql,'B00140N5CS')
print(cursor.fetchall())
db.close()
运行后即可获取查询到的数据。

最后,建议大家多查阅官方文档或标准教程,这对学习更有益。
以上关于 Python MySQLdb 执行 SQL 语句时的参数传递方式的全部内容,希望能给大家提供参考,也希望大家多多支持本站。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









