我想要将整个pandas数据框插入到mysql中,使用"insert ignore"。有没有一种方法可以在不循环行的情况下完成此操作?
在dataframe.to_sql中,我只看到了'append'选项,但这是否仍会继续处理重复的唯一键?
在dataframe.to_sql中,我只看到了'append'选项,但这是否仍会继续处理重复的唯一键?
考虑使用一个与最终表格结构完全相同的临时表,并始终将其替换为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()
在目前的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
with engine.connect() as connection: result = connection.execute("INSERT IGNORE INTO myFinalTable SELECT * FROM myTempTable")
这将通过上下文管理器处理连接并在操作完成后自动关闭连接。 - kristian