2017-11-21 2 views
0

Ich arbeite an einem Python-Skript, um Daten in eine MySQL-Datenbank zu importieren. Ich benutze MySQLdb, um meine Abfragen auszuführen. auch eine Funktion verwenden, um eine Abfrage und seine Daten mit dem Namen einzustellenden Parameter automatisch in der Anforderung, wie ersetzt werdenPython MySQLdb Abfrageparameter "IS NULL" statt "= NULL"

I:

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

Ich mag diese Art und Weise wirklich, weil ich die gleichen Daten bin mit dict für 3 oder 4 Abfragen.

Das Problem ist, wenn ich versuche, einen WHERE Zustand mit None Wert zu machen, hat es meine None durch NULL ersetzen, aber ich möchte es eine `param1` = NULL durch `param1` IS NULL, ersetzen zu können, so dass die Bedingung true ergibt.

Gibt es eine Möglichkeit, dieses Problem direkt zu lösen? Oder kann ich nur den Parameter replace verwenden (ohne die Abfrage auszuführen), dann einen eigenen ersetzen (= NULL bis IS NULL) und dann die Abfrage ausführen.

Antwort

2

Sie können etwas wie das Folgende tun.

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 Anfangs habe ich nicht die neueste Version des Snippets eingefügt, wo 'param_whitelist' nicht verwendet wird. Es ist im Update behoben. – saaj

Verwandte Themen