2017-11-21 3 views
0

나는 Python 스크립트를 사용하여 MySQL 데이터베이스로 데이터를 가져오고 있습니다. MySQLdb를 사용하여 쿼리를 실행합니다.Python MySQLdb 쿼리 매개 변수 "= NULL"대신 "IS NULL"

나는 또한 쿼리와 명명 된 매개 변수와 데이터를 설정하는 기능을 사용

자동으로 같은 요청 안에 교체 할 : 나는 동일한 데이터를 사용하고 있기 때문에 정말 이런 식으로 같은

req = "SELECT * FROM sample WHERE `id` = %(id)s and `param1` = %(param1)s" 
data = {'id': 15, 'param1': None} 
cursor.execute(req, data) 

3 또는 4 개의 검색어에 대해 dict 내가 None 값으로 WHERE 조건을 만들려고 할 때

문제

는 내 None NULL에 의해 대체하지 않습니다하지만 난 그게 조건이 true로 평가하도록하는 `param1` = NULL `param1` IS NULL으로 대체 할 수 있도록하고 싶습니다이다.

이 문제를 직접 해결할 수있는 방법이 있습니까? 또는 (쿼리를 실행하지 않고) 매개 변수 바꾸기 만 사용하고 직접 바꾸기 (= NULL ~ IS NULL) 쿼리를 실행할 수 있습니다.

답변

2

다음과 같이 할 수 있습니다.

def query(params): 
    # Make sure it's hardcoded and malicious user can't overwrite it 
    param_whitelist = 'id', 'param1' 

    sql = ''' 
     SELECT * 
     FROM sample 
     WHERE {placeholders} 
    ''' 
    placeholders = ' AND '.join(
     '`{field}` {op} %s'.format(field=k, op='IS' if params[k] is None else '=') 
     for k in param_whitelist) 
    sql = sql.format(placeholders=placeholders) 

    cursor.execute(sql, params) 
    return cursor 


data = {'id': 15, 'param1': None} 
print([r for r in query(data)]) 
+1

@ m.nachury 처음에는'param_whitelist'가 사용되지 않은 스 니펫의 최신 버전을 붙여 넣지 않았습니다. 업데이트에서 수정되었습니다. – saaj