如何从 pandas 数据帧更新 ms 访问中的多行
how to update multiple rows in ms access from pandas dataframe
我正在尝试从 pandas 数据帧中的列执行此更新查询:
sql = "UPDATE tblhis_ventas SET portabilidad = '%s' WHERE (contrato = '%s' and estado = '%s') " % (
df['portabilidad'], df['contrato'], df['estado']
)
cursor.execute(sql)
查询未执行且未显示任何错误。
我的数据框如下所示:
迭代行,并逐行更新:
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']])
不幸的是,SQLAlchemy 不支持 MS Access(特别是它的 disk-level Jet/ACE 引擎而不是 GUI .exe 程序)以允许 pandas.to_sql()
方法理想情况下,您可以将数据帧推送到数据库中的临时 table 到 运行 一个 UPDATE final INNER JOIN temp ...
查询以更新最终 table,这比跨行迭代快得多。
幸运的是,MS Access 的 Jet/ACE 引擎可以查询 csv 文件,就好像它们是 tables,您可以在其中指定文件的路径,然后指定 csv 文件的名称。因此,考虑导出数据框 to_csv, then create a temp table using the Make-Table 查询,最后 运行 更新连接查询。 try/except
下方用于删除 table(如果存在)(因为 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 文件(绕过临时 table 进程),因为 csv 是 read-only 而不是 可更新记录集。有趣的是,您可以在 INSERT...SELECT
.
中使用 CSV
我正在尝试从 pandas 数据帧中的列执行此更新查询:
sql = "UPDATE tblhis_ventas SET portabilidad = '%s' WHERE (contrato = '%s' and estado = '%s') " % (
df['portabilidad'], df['contrato'], df['estado']
)
cursor.execute(sql)
查询未执行且未显示任何错误。
我的数据框如下所示:
迭代行,并逐行更新:
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']])
不幸的是,SQLAlchemy 不支持 MS Access(特别是它的 disk-level Jet/ACE 引擎而不是 GUI .exe 程序)以允许 pandas.to_sql()
方法理想情况下,您可以将数据帧推送到数据库中的临时 table 到 运行 一个 UPDATE final INNER JOIN temp ...
查询以更新最终 table,这比跨行迭代快得多。
幸运的是,MS Access 的 Jet/ACE 引擎可以查询 csv 文件,就好像它们是 tables,您可以在其中指定文件的路径,然后指定 csv 文件的名称。因此,考虑导出数据框 to_csv, then create a temp table using the Make-Table 查询,最后 运行 更新连接查询。 try/except
下方用于删除 table(如果存在)(因为 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 文件(绕过临时 table 进程),因为 csv 是 read-only 而不是 可更新记录集。有趣的是,您可以在 INSERT...SELECT
.