2014-07-22 10 views
7

Ich benutze PANDAS mit einem SQLAlchemy zu schreiben MYSQL DB mit DataFrame.to_sql. Ich möchte die Flagge für 'append' --> df.to_sql(con=con, name='tablename', if_exists='append') einschalten Da das Programm während des Tages mehrere kleine Schreibvorgänge in die Tabellen ausführt, möchte ich nicht, dass die gesamte Tabelle mit replace überschrieben wird. Von Zeit zu Zeit habe ich die doppelten Eintrag Fehler:Pandas to_sql mit sqlAlchemy doppelte Einträge Fehler in mysqldb

sqla: valuesToCalc has error: (IntegrityError) (1062, "Duplicate entry 
'0-0000-00-00-00:00:00' for key 'PRIMARY'") 'INSERT INTO valuesToCalc() VALUES()'() 

irgendeine Weise die Syntax "on duplicate key update" zu einem pd.to_sql hinzufügen? Muss ich aufhören, to_sql zu verwenden und direkt mit sqlAlchemy zu gehen? Ich hatte gehofft, nicht zu.

Antwort

5

Nicht sicher, ob Sie eine Antwort gefunden, aber hier ist eine Abhilfe, die für mich gearbeitet:

Aufruf der .to_sql() auf einer temporäre Tabelle dann eine Abfrage verwenden, um die Haupt-Tabelle mit der temporären Tabelle zu aktualisieren. Dann können Sie die temporäre Tabelle löschen. So zum Beispiel:

df.to_sql(con=con, name='tablename_temp', if_exists='replace') 
connection = con.connect() 
connection.execute(text("INSERT INTO tablename SELECT * FROM tablename_temp ON DUPLICATE KEY UPDATE tablename.field_to_update=tablename_temp.field_to_update")) 
connection.execute(text('DROP TABLE tablename_temp ')) 
2

Hier ist, was ich am Ende tun:

#df is a dataframe 
    num_rows = len(df) 
    #Iterate one row at a time 
    for i in range(num_rows): 
     try: 
      #Try inserting the row 
      df.iloc[i:i+1].to_sql(name="Table_Name",con = Engine_Name,if_exists = 'append',index=False) 
     except IntegrityError: 
      #Ignore duplicates 
      pass 
Verwandte Themen