2014-07-22 14 views
7

Używam PANDAS z SQLAlchemy do pisania do DB MySQL przy użyciu DataFrame.to_sql. Chciałbym włączyć flagę dla 'append' --> df.to_sql(con=con, name='tablename', if_exists='append') Ponieważ program wykonuje kilka małych zapisów do tabel w ciągu dnia, nie chcę, aby cała tabela była zastępowana przez zamianę. Okresowo uzyskać duplikat błąd zapisu:Pandas to_sql z błędem sqlAlchemy duplikatów wpisów w mysqldb

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

jakikolwiek sposób dodawania składni "on duplicate key update" do pd.to_sql? Czy muszę przestać używać to_sql i przejść bezpośrednio z sqlAlchemy? Miałem nadzieję, że nie.

Odpowiedz

5

Nie wiem, czy znaleźliście odpowiedź, ale tutaj jest obejście tego problemu, który pracował dla mnie:

zadzwoń .to_sql() w tabeli tymczasowej, a następnie użyć kwerendy zaktualizować główną tabelę z tabeli temp. Następnie możesz upuścić tabelę tymczasową. Tak więc na przykład:

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

Oto co skończyło się robi:

#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 
Powiązane problemy