2014-12-03 57 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