2017-02-19 200 views
1

我想在大熊猫数据帧执行从列此更新查询如何更新的MS Access多行。从熊猫数据框中

我的数据框看起来象下面这样:

Data Table Screeshot

回答

1

不幸的是,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。

+0

它的作品!速度非常快。我不知道ms访问中的临时csv文件。我非常感谢你们所有人。 – calobeto

0

迭代行,并更新逐一:

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']]) 
+0

它的工作原理!问题是表格超过10K,更新一个字段需要10分钟以上,我需要10个字段以上;)。有一个快速的方法吗? – calobeto

+0

@calobeto,你能显示整个代码吗?如果不知道选择了哪些数据,以及使用'df'完成了哪些操作,我无法告诉你如何改进它,甚至不能告诉你是否可能。 – falsetru