-1

我正在使用 mysql 连接器 1.0.9。和 Python 3.2

此查询因语法错误而失败(mysql.connector 抛出 ProgrammingError,具体的 MySQL 错误只是“%(IP)s AND DATE_SUB(NOW(), INTERVAL 1 HOUR) 右侧存在语法错误<访问“:

SELECT COUNT(*) FROM bad_ip_logins WHERE IP = %(IP)s AND DATE_SUB(NOW(), INTERVAL 1 HOUR) < accessed

但是,如果我引用变量 IP,它会起作用:

SELECT COUNT(*) FROM bad_ip_logins WHERE IP = '%(IP)s' AND DATE_SUB(NOW(), INTERVAL 1 HOUR) < accessed

在上下文中:

IP = 1249764151  # IP converted to an int
conn = mysql.connector.connect(db_params)
curs = conn.cursor()
query = "SELECT COUNT(*) FROM bad_ip_logins WHERE IP = %(IP)s AND DATE_SUB(NOW(), INTERVAL 1 HOUR) < accessed"
params = {'IP', IP}
curs.execute(query, params)

我的理解是,您永远不必为准备好的语句引用变量​​(对于我的代码中的所有其他查询都是如此,即使是访问此表上 IP 变量的查询)。为什么我需要在这个单一实例中引用它,而不是在其他地方?

如果这不是一个准备好的声明,我也会有兴趣听到这一点。我无法用这个注入任何东西 - 它只是以防止这种方式引用它吗?

如果重要的话,这是表格描述:

+----------+------------------+------+-----+---------+-------+
| Field    | Type             | Null | Key | Default | Extra |
+----------+------------------+------+-----+---------+-------+
| IP       | int(10) unsigned | YES  |     | NULL    |       |
| user_id  | int(11)          | YES  |     | NULL    |       |
| accessed | datetime         | YES  |     | NULL    |       |
+----------+------------------+------+-----+---------+-------+
4

1 回答 1

2

不要使用字符串插值。将 SQL 参数留给数据库适配器:

cursor.execute('''\
    SELECT COUNT(*) FROM bad_ip_logins WHERE IP = %s AND DATE_SUB(NOW(), INTERVAL 1 HOUR) < accessed''', (ip,))

在这里,我们将参数作为单独的参数传递ipexecute()调用(在元组中,使其成为一个序列),数据库适配器将负责正确的引用,填充%s占位符。

于 2013-05-21T22:42:24.427 回答