如何从 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