要将数据插入MySql,我在Python 3中执行此操作:
import MySQLdb
# .....
cursor.execute("""INSERT INTO table1(col1, col2, col3) VALUES(%s, %s, %s)""" ,(data["col1"], data["col2"], data["col3"])
由于它是Python 3,我可以将%s
替换为format
吗?
答案 0 :(得分:4)
不,在这种情况下你不能。与数据库访问结合使用的%s
用法仅与%s
的“正常”用法远程相关。具体来说,%s
只是数据库获取其参数的一种可能方式。还有其他几种方法,?
,它们是特定于数据库的。
然而,最大的区别在于数据库可以自行选择正确的数据处理,例如预处理语句或数据转义。在这两种情况下,传递到数据库的数据都不会受到任何注入。
OTOH,如果您使用自己的格式,无论是%
还是.format()
,您都无法安全地进行SQL注入。
换句话说,不,使用.format()
进行数据库查询汇编是不可取的,很容易导致安全漏洞。
所以.format()
是"%s" % whatever
的绝佳替代品,但不适用于corsor.execute("... %s ...", whatever)
,因为这是完全不同的事情。
答案 1 :(得分:1)
从source code of the execute
method中汲取灵感,你可以写:
connection = cursor._getDb()
cursor.execute("""INSERT INTO table1(col1, col2, col3) VALUES({}, {}, {})""".format(
connection.literal(data["col1"]),
connection.literal(data["col2"]),
connection.literal(data["col3"])
))
现在,我没有说你应该做什么......