Pandas to_sql 与 mysqldb 中的 sqlAlchemy 重复条目错误

问题描述 投票:0回答:3

我正在使用 PANDAS 和 SQLAlchemy 来使用

DataFrame.to_sql
写入 MYSQL DB。 我喜欢打开
'append' --> df.to_sql(con=con, name='tablename', if_exists='append')
的标志,因为程序在白天对表进行了几次小写入,所以我不希望用替换覆盖整个表。 我定期收到重复输入错误:

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

有什么方法可以将语法

"on duplicate key update"
添加到 pd.to_sql 吗? 我是否必须停止使用
to_sql
并直接使用 sqlAlchemy?我本来希望不会。

pandas sqlalchemy
3个回答
13
投票

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

在临时表上调用

.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 '))

7
投票

这就是我最终所做的:

    #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

0
投票

我知道这篇文章已有 10 年历史,但它是我所有搜索中的第一篇,我终于找到了一个我认为更好的解决方案:

from sqlalchemy.dialects.mysql import insert

def insert_ignore(table, conn, keys, data_iter):
    df = pd.DataFrame(data_iter,columns=keys)
    insert_stmt = insert(table.table).values(df)
    ignore_stmt = insert_stmt.prefix_with('IGNORE')
    conn.execute(ignore_stmt)

然后,在 df.to_sql 中用 method= 调用它

df.to_sql("sometable",connection,if_exists="append",index=False, 
method=insert_ignore)
© www.soinside.com 2019 - 2024. All rights reserved.