我正在尝试从 pandas 数据框中的列执行此更新查询:
sql = "UPDATE tblhis_ventas SET portabilidad = '%s' WHERE (contrato = '%s' and estado = '%s') " % (
df['portabilidad'], df['contrato'], df['estado']
)
cursor.execute(sql)
查询未执行且未显示错误。
我的数据框如下所示:
我正在尝试从 pandas 数据框中的列执行此更新查询:
sql = "UPDATE tblhis_ventas SET portabilidad = '%s' WHERE (contrato = '%s' and estado = '%s') " % (
df['portabilidad'], df['contrato'], df['estado']
)
cursor.execute(sql)
查询未执行且未显示错误。
我的数据框如下所示:
不幸的是,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
.
迭代行,并一一更新:
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']])