2014-07-22 17 views
7

Sto usando PANDAS con SQLAlchemy per scrivere su DB MYSQL utilizzando DataFrame.to_sql. Mi piace attivare il flag per 'append' --> df.to_sql(con=con, name='tablename', if_exists='append') Poiché il programma esegue diverse piccole scritture sulle tabelle durante il giorno, non desidero che l'intera tabella venga sovrascritta con Sostituisci. Periodicamente, ottengo l'errore voce duplicata:Pandas to_sql con sqlAlchemy errore di voci duplicate in mysqldb

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

Un modo per aggiungere la sintassi "on duplicate key update" ad un pd.to_sql? Devo smettere di usare to_sql e andare direttamente con sqlAlchemy? Speravo di non farlo.

risposta

5

Non sono sicuro se hai trovato una risposta, ma ecco una soluzione che ha funzionato per me:

chiamata .to_sql() su una tabella temporanea quindi utilizzare una query per aggiornare la tabella principale con la tabella temporanea. Quindi è possibile rilasciare la tabella temporanea. Così, per esempio:

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

Ecco quello che ho finito per fare:

#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 
Problemi correlati