2014-12-03 31 views
0

我使用PyMYSQL從MySQL數據庫中查詢數據。我想用一個例子查詢:PyMYSQL - 選擇值可以爲NULL

SELECT count(*) AS count 
FROM example 
WHERE item = %s 
LIMTI 1 

這將使用

query = "SELECT COUNT(*) as count FROM example WHERE item = %s LIMIT 1" 
cur.execute(query,(None)) 

cur.execute(query,(10)) 

的問題是,項目運行可以有NULL值,這導致在

WHERE item = NULL 

W這在MySQL中不起作用。它應該是

WHERE item IS NULL 

但是,該值也可以是整數。我怎樣才能讓PyMySQL調整查詢來處理這兩種情況?

回答

0

你可以做一個簡單的函數來捕捉None情況:

def null_for_sql(a): 
    return "is NULL" if not a else "= " + str(a) 

,然後調用這樣的查詢:

query = "SELECT COUNT(*) as count FROM example WHERE item %s LIMIT 1" 
cur.execute(query,null_for_sql(None)) 

注意有沒有「=」之後的「項目」在評論後查詢

編輯:

def sql_none_safe_generator(query,parameter): 
    if parameter: 
    return query.replace(%param, "= " + str(parameter)) 
    else: 
    return query.replace(%param, is NULL) 

query = "SELECT COUNT(*) as count FROM example WHERE item %param LIMIT 1" 
cur.execute(sql_none_safe_generator(query,a)) 
+0

這是在正確的軌道,但不會工作,因爲它會創建SELECT COUNT(*)作爲計數從示例WHERE項'爲空'限制1 – user2694306 2014-12-03 12:02:55

+0

如果我運行'打印「SELECT COUNT(*)作爲計數從示例WHERE item%s LIMIT 1「%null_for_sql(None)'我的輸出是'SELECT COUNT(*)as count FROM example WHERE item is NULL LIMIT 1'。如果我記得weel,'cur.execute'的行爲就像'print' with'%s',所以執行的查詢將會在''「周圍沒有」null「 - 使用Py2.7 BTW – Hrabal 2014-12-03 12:18:26

+0

@ user2694306是對的,執行(q,vals)函數中的vals參數的整點是綁定並轉義vals以消除注入攻擊。驅動程序會將'NULL'轉義爲「NULL」,從而導致無效的SQL。 – anq 2015-01-15 18:22:50