2013-05-21 20 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佔位符。

相關問題