2013-05-21 18 views
-1

我正在使用mysql连接器1.0.9。和Python 3.2python和mysql.connector需要引用unsigned int

此查询由于语法错误而失败(mysql.connector引发ProgrammingError,具体的MySQL错误只是“%(IP)s AND DATE_SUB(NOW() ,间隔1小时)<访问“:

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 |  | 
+----------+------------------+------+-----+---------+-------+ 
+1

你使用这个语句的Python *代码是什么?异常的完整回溯是什么? –

+2

什么是语法错误? – jpmc26

+0

您确定您实际上在占位符处使用准备好的语句吗?因为这看起来与如果错误地使用Python的'%'操作符时会发生什么,而不是让MySQL填充占位符。 (这就是为什么我们需要查看Python代码。) – abarnert

回答

2

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

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

在这里,我们通过参数ip到​​呼叫作为一个单独的参数(在一个元组,使之成为序列),以及数据库适配器将采取谨慎引用,填写%s占位符。

相关问题