2017-02-19 4 views
1

Dataframe Ich versuche, diese Update-Abfrage von Spalten in einer Pandas Datenrahmen auszuführen:wie mehrere Zeilen in ms Zugriff aktualisieren von Pandas

sql = "UPDATE tblhis_ventas SET portabilidad = '%s' WHERE (contrato = '%s' and estado = '%s') " % (
    df['portabilidad'], df['contrato'], df['estado'] 
) 

cursor.execute(sql) 

Die Abfrage wird nicht ausgeführt und keine Fehler angezeigt.

Meine Datenrahmen sieht unten wie:

Data Table Screeshot

Antwort

1

Leider MS Access (speziell dessen Laufwerk-Jet/ACE Motor nicht Das Programm GUI.exe) wird nicht mit SQLAlchemy unterstützt, um die pandas.to_sql() Methode zu ermöglichen, die Sie idealerweise Ihren Datenrahmen in eine temporäre Tabelle in der Datenbank schieben können, um eine UPDATE final INNER JOIN temp ... Abfrage zu führen, um finale Tabelle zu aktualisieren, ein viel schnellerer Router e als Iteration über Zeilen.

Zum Glück, MS Access' Jet/ACE Engine kann CSV-Dateien abfragen, als ob sie Tische, wo Sie den Dateipfad angeben und dann von CSV-Datei benennen. Erwägen Sie daher, den Datenrahmen to_csv zu exportieren, erstellen Sie dann eine temporäre Tabelle mit der Abfrage Make-Table, und führen Sie schließlich die Update-Join-Abfrage aus. Unter try/except wird verwendet, um die Tabelle zu löschen, wenn sie existiert (seit IF EXISTS Befehl ist in MS Access SQL nicht verfügbar).

df.to_csv('C:\Path\To\CSV\Output.csv', index=False) 

try: 
    cursor.execute("SELECT * INTO tblhis_ventas_Temp" +\ 
        " FROM [text;HDR=Yes;FMT=Delimited(,);Database=C:\Path\To\CSV].Output.csv") 
    conn.commit() 

    cursor.execute("UPDATE tblhis_ventas f INNER JOIN tblhis_ventas_Temp t" + \ 
        " ON f.contrato = t.contrato AND f.estado = t.estado" + \ 
        " SET f. portabilidad = t.portabilidad") 
    conn.commit() 

except Exception as e:  
    if 'already exists' in str(e): 
     cursor.execute("DROP TABLE tblhis_ventas_Temp") 
     conn.commit() 
    else: 
     print(e) 

cursor.close() 
conn.close() 

Und nein, wir können nicht direkt CSV-Datei in UPDATE Abfrage verwenden (temporäre Tabelle Prozess unter Umgehung) als csv ist eine schreibgeschützte und nicht aktualisierbar-Cord. Interessanterweise können Sie CSV in einem INSERT...SELECT verwenden.

+0

es funktioniert !. Es ist sehr schnell. Ich kannte die temporären CSV-Dateien nicht in MS-Zugriff. Ich bin Ihnen allen sehr dankbar. – calobeto

0

Iterate Reihen und aktualisieren eins nach dem anderen:

sql = 'UPDATE tblhis_ventas SET portabilidad = ? WHERE contrato = ? and estado = ?' 
for index, row in df.iterrows(): 
    cursor.execute(sql, [row['portabilidad'], row['contrato'], row['estado']]) 
+0

es funktioniert !. Das Problem ist, dass die Tabelle über 10k ist und es mehr als 10 Minuten dauert, um ein Feld zu aktualisieren, ich brauche 10 Felder mehr;). Gibt es einen schnellen Weg? – calobeto

+0

@calobeto, Können Sie den ganzen Code anzeigen? Ohne Know der ausgewählten Daten und welche Operation mit 'df' getan, kann ich Ihnen nicht sagen, wie es zu verbessern oder sogar Ihnen sagen, ob es möglich ist. – falsetru

Verwandte Themen