插入(...) - 我可以使用"格式"而不是"%s"在Python3?

时间:2016-02-04 12:30:23

标签: python mysql python-3.x

要将数据插入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吗?

2 个答案:

答案 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"])
))

现在,我没有说你应该做什么......