在mysqldb中带有sqlAlchemy重复条目的Pandas to_sql错误

use*_*132 8 sqlalchemy pandas

我正在使用带有SQLAlchemy的PANDAS来编写MYSQL DB DataFrame.to_sql.我喜欢打开标志'append' --> df.to_sql(con=con, name='tablename', if_exists='append')因为程序在白天对表执行了几次小写操作,所以我不希望整个表被替换为replace.我定期得到重复输入错误:

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

有没有办法将语法添加"on duplicate key update"到pd.to_sql?我是否必须停止使用to_sql并直接使用sqlAlchemy?我希望不要.

小智 10

不确定你是否找到了答案,但这是一个对我有用的解决方法:

.to_sql()在临时表上调用然后使用查询来使用临时表更新主表.然后你可以删除临时表.例如:

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 '))
Run Code Online (Sandbox Code Playgroud)


NFe*_*ern 5

这是我最终要做的事情:

    #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
Run Code Online (Sandbox Code Playgroud)

  • 顺便说一句,这是相当低效的,不推荐。 (4认同)