从熊猫数据框中
答
不幸的是,MS接入(特别是其磁盘级喷气/ ACE引擎不GUI .exe程序)不支持SQLAlchemy以允许pandas.to_sql()
方法,理想情况下,您可以将数据库推送到数据库中的临时表以运行UPDATE final INNER JOIN temp ...
查询来更新最终表,这是一个更快的方法而不是遍历行。
幸运的是,MS Access的Jet/ACE引擎可以查询csv文件,就好像它们是指定文件路径的表,然后指定csv文件的名称一样。因此,请考虑导出数据帧to_csv,然后使用Make-Table查询创建临时表,最后运行更新连接查询。如果存在,则使用低于try/except
来删除该表(因为IF EXISTS
命令在MS Access SQL中不可用)。
df.to_csv('C:\Path\To\CSV\Output.csv', index=False)
try:
cursor.execute("SELECT * INTO tblhis_ventas_Temp" +\
" FROM [text;HDR=Yes;FMT=Delimited(,);Database=C:\Path\To\CSV].Output.csv")
conn.commit()
cursor.execute("UPDATE tblhis_ventas f INNER JOIN tblhis_ventas_Temp t" + \
" ON f.contrato = t.contrato AND f.estado = t.estado" + \
" SET f. portabilidad = t.portabilidad")
conn.commit()
except Exception as e:
if 'already exists' in str(e):
cursor.execute("DROP TABLE tblhis_ventas_Temp")
conn.commit()
else:
print(e)
cursor.close()
conn.close()
不,我们不能直接使用CSV文件中UPDATE
查询(绕过临时表的过程)作为CSV是只读的,而不是更新记录。有趣的是,您可以在INSERT...SELECT
中使用CSV。
答
迭代行,并更新逐一:
sql = 'UPDATE tblhis_ventas SET portabilidad = ? WHERE contrato = ? and estado = ?'
for index, row in df.iterrows():
cursor.execute(sql, [row['portabilidad'], row['contrato'], row['estado']])
它的作品!速度非常快。我不知道ms访问中的临时csv文件。我非常感谢你们所有人。 – calobeto