2016-04-27 8 views
3

Ich erzeuge eine SQL-Datei mit Einfügeanweisungen mit einem Python-Skript, aber ich weiß nicht, wie Sie NULL-Werte einfügen.Python - Wie NULL Mysql-Werte einfügen

Ich habe ein Wörterbuch, in dem Schlüssel der Name der Spalten und die Werte die Werte sind, die ich einfügen möchte. Zum Beispiel:

d = {"column1":"1", "column2":"test", "column3":None} 

Dann mag ich, dass die Werte in der Aussage meines Einsatzes verwenden.

sqlfile.write("INSERT INTO test VALUES ('" + d["column1"] + "', '" + d["column2"] + "', '" + d["column3"] + "')") 

Aber dies wird einen Fehler zurück, weil nicht Art und Strings nicht verkettet werden können, und wenn ich keine durch ‚NULL‘ ersetzen wird es eine 0 in der Datenbank einzufügen.

Wie kann ich das lösen?

+1

Warum hast du dann Zitate um den NULL gesetzt? 'sqlfile.write (" INSERT INTO test VALUES ('1', 'test', NULL) ") fügt einen tatsächlichen NULL ein. –

+0

Sorry @MartijnPieters Ich habe es nicht gut erklärt. Die Frage wurde bearbeitet :) – SLFl

Antwort

3

Sie fügen die Zeichenfolge'NULL', nicht die NULL Wert. Wenn diese Werte von einer Python-Struktur kommen, müssen Sie etwas anderes verwenden, um dem Wert NULL in SQL zuzuordnen.

Sie None dafür verwenden könnte, und nur zitieren andere Werte:

def sqlquote(value): 
    """Naive SQL quoting 

    All values except NULL are returned as SQL strings in single quotes, 
    with any embedded quotes doubled. 

    """ 
    if value is None: 
     return 'NULL' 
    return "'{}'".format(str(value).replace("'", "''")) 

sql = "INSERT INTO test VALUES ({column1}, {column2}, {column3})".format(
    **{k: sqlquote(v) for k, v in d.items()}) 

Beachten Sie, dass, weil Sie None anders zu behandeln haben, können Sie auch behandeln müssen unter Angabe richtige SQL! Wenn einer Ihrer Werte direkt oder indirekt von benutzerdefinierten Daten stammt, sind Sie andernfalls anfällig für SQL-Injection-Angriffe.

Die obige sqlquote() Funktion sollte genügen für SQLite strings, die den Standard-SQL-Anführungsregeln folgen. Verschiedene Datenbanken haben unterschiedliche Regeln dafür, also dreifach überprüfen Sie Ihre Dokumentation.

Persönlich würde ich die SQLAlchemy library verwenden, um SQL zu generieren und haben es handle für Sie zitieren. Sie können es konfigurieren, um SQL für verschiedene Datenbank-Engines zu erzeugen.

+0

Sorry @MartijnPieters habe ich nicht gut erklärt. Die Frage wurde bearbeitet :) – SLFl

+0

@ F.Rita: Nein, hast du nicht. Das war ein ziemlich großes Detail, das du weggelassen hast. Aktualisiert. –

+0

Das hat die Sache: return "'{}'". Format (str (Wert) .replace ("'", "")) Danke !!! – SLFl