将忽略重复行的 Pandas 数据帧插入到 MySQL 数据库中

8
我想要将整个pandas数据框插入到mysql中,使用"insert ignore"。有没有一种方法可以在不循环行的情况下完成此操作?
在dataframe.to_sql中,我只看到了'append'选项,但这是否仍会继续处理重复的唯一键?
2个回答

18

考虑使用一个与最终表格结构完全相同的临时表,并始终将其替换为Pandas,然后在游标调用中运行INSERT IGNORE

dataframe.to_sql('myTempTable', con, if_exists ='replace')

cur = con.cursor()
cur.execute("INSERT IGNORE INTO myFinalTable SELECT * FROM myTempTable")
con.commit()

3
如果您使用SQLAlchemy,请将最后3行替换为以下内容:with engine.connect() as connection: result = connection.execute("INSERT IGNORE INTO myFinalTable SELECT * FROM myTempTable")这将通过上下文管理器处理连接并在操作完成后自动关闭连接。 - kristian

0

在目前的pandas版本(0.20.3)中,无法以这种方式实现。

文档所述,选项if_exists仅适用于表格(而不是行)。

if_exists : {‘fail’, ‘replace’, ‘append’}, default ‘fail’

fail:如果表格存在,则不执行任何操作。

replace:如果表格存在,则删除它,重新创建并插入数据。

append:如果表格存在,则插入数据。如果不存在则创建。

通过循环

这将减慢进程速度,因为您每次只插入一行。

for x in xrange(data_frame.shape[0]):
    try:
        data_frame.iloc[x:x+1].to_sql(con=sql_engine, name="table_name", if_exists='append')
    except IntegrityError:
        # Your code to handle duplicates
        pass 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接