2016-07-14 16 views
2

Ich benutze Pymssql, um eine Verbindung zu einer MS SQL DB auf Azure und Einfügen von Datensätzen aus einer CSV-Datei. Ich habe überprüft, dass die Verbindung erfolgreich ist und dass die für den Parameter executemany verwendete Liste alle Daten im richtigen Format und mit der richtigen Anzahl an Werten enthält. Allerdings, wenn ich das Skript ausführen, werden 0 Zeilen eingefügt - aber kein Fehler wird ausgelöst.Erfolgreiche Verbindung zu MS SQL DB auf Azure mit Pymssql, INSERT-Anweisung ohne Fehlermeldung, aber 0 Zeilen eingefügt

Ich sah mich um und es scheint, als ob die meisten anderen, die etwas ähnliches erlebt haben, das commit() vermisst haben, aber das ist nicht das Problem hier.

Hier ist der Code. Jede Hilfe wird sehr geschätzt.

with open('file.csv') as csvfile: 
    data = csv.reader(csvfile) 
    next(data) 
    dicts = ({'col1': line[0], 'col1': line[1], 'col3': line[2], 'col4': int(line[3]), 'col5': int(line[4]), 'col6': float(line[5])} for line in data) 
    to_db = ((i['col1'], i['col2'], i['col3'], i['col4'], i['col5'], i['col6']) for i in dicts) 
    cursor.executemany(
     'INSERT INTO myTable VALUES (%s, %s, %s, %d, %d, %f)', 
     to_db) 
    print str(cursor.rowcount) + " rows inserted" 
    conn.commit() 

Edit: Wenn ich die Abfrage mit cursor.execute() ausführen und umfassen die Werte explizit in der Abfrage dann kann ich erfolgreich Zeilen in die Datenbank einfügen (siehe unten zum Beispiel).

cursor.execute("INSERT INTO myTable VALUES ('4/18/2016','test','test',0,0,0.0)") 

Aber wenn ich Benutzer die cursor.executemany (Betrieb, Parameter) Syntax und eine Liste der Werte als Parameter übergeben wird, dann führt dies zu einem falschen Syntaxfehler.

cursor.executemany("INSERT INTO myTable VALUES(%s,%s,%s,%d,%d,%f)",list_of_values) 

ich im module reference gerade las, die nur% s und% d unterstützt werden. Ich denke, das könnte das Problem sein. Aber wie überlasse ich einen Schwimmer?

+0

Was passiert, wenn Sie versuchen, eine Beispielabfrage wie diese in der Konsole auszuführen? – Ares

+0

Ich kann Zeilen erfolgreich aus MS SQL Server Management Studio einfügen. – michoco

+0

Gibt das Python-Skript an, dass keine Zeilen geändert wurden? Werden die Änderungen in der DB wiedergegeben? – Ares

Antwort

2

Die Verwendung des Float-Platzhalters (% f) war tatsächlich das Problem. Nur% s und% d werden unterstützt, sind aber reine Platzhalter und haben keine Auswirkungen auf die Formatierung, wie sie es normalerweise in Python tun, so dass wirklich nur% s benötigt wird. Der Arbeitscode lautet wie folgt:

cursor.executemany("INSERT INTO myTable VALUES(%s,%s,%s,%s,%s,%s)",list_of_values)