使用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
执行相应的替换。这种方法存在漏洞,有些时候不能正常解析,比如包含某些特殊字符,甚至会造成注入攻击的风险。 -
第二种,变量是作为execute的参数传入的,由MySQLdb的内置方法把变量解释成合适的内容。
一般情况下,建议使用第二种方法,把变量作为参数传递给execute
。
3.使用字典dict类型传递参数
sql = "select * from orange where %(color)s, %(weight)s"
values = {"color": "yellow", "weight": 30}
cursor.execute(sql, values)
这种方式,传递的参数对应关系比较清晰。尤其是参数比较多时,使用字典,可以保证传递参数的顺序正确。
Just try, don't shy.