1

我正在尝试从 pandas 数据框中的列执行此更新查询:

sql = "UPDATE tblhis_ventas SET portabilidad = '%s' WHERE (contrato = '%s' and estado = '%s') " % (
    df['portabilidad'], df['contrato'], df['estado']
)

cursor.execute(sql)

查询未执行且未显示错误。

我的数据框如下所示:

数据表截图

4

2 回答 2

1

不幸的是,SQLAlchemy 不支持 MS Access(特别是它的磁盘级 Jet/ACE 引擎,而不是 GUI .exe 程序)以允许使用这种pandas.to_sql()方法,理想情况下,您可以将数据帧推送到数据库中的临时表以运行UPDATE final INNER JOIN temp ...查询以更新最终表,比跨行迭代更快的路线。

幸运的是,MS Access 的 Jet/ACE 引擎可以查询 csv 文件,就好像它们是您指定文件路径和 csv 文件名称的表一样。因此,考虑将数据帧导出到_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()

不,我们不能直接在UPDATE查询中使用 CSV 文件(绕过临时表进程),因为 csv 是只读且不可更新的记录集。有趣的是,您可以在INSERT...SELECT.

于 2017-02-20T01:04:00.447 回答
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']])
于 2017-02-19T03:29:40.603 回答