【问题标题】:how to update multiple rows in ms access from pandas dataframe如何从熊猫数据框更新ms访问中的多行
【发布时间】:2017-02-19 03:14:06
【问题描述】:

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

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

cursor.execute(sql)

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

我的数据框如下所示:

【问题讨论】:

    标签: python pandas pyodbc python-db-api


    【解决方案1】:

    不幸的是,SQLAlchemy 不支持 MS Access(特别是它的磁盘级 Jet/ACE 引擎而不是 GUI .exe 程序)以允许使用 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()
    

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

    【讨论】:

    • 它有效!它非常快。我不知道 ms 访问中的临时 csv 文件。我非常感谢你们。
    【解决方案2】:

    迭代行,并一一更新:

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

    【讨论】:

    • 它有效!问题是表超过 10k,更新一个字段需要 10 多分钟,我还需要 10 个字段;)。有没有快速的方法?
    • @calobeto,你能显示整个代码吗?在不知道选择了哪些数据,用df做了什么操作的情况下,我无法告诉你如何改进它,甚至无法告诉你是否可以。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-28
    • 2019-10-28
    • 2021-01-15
    • 2021-11-03
    • 2017-03-23
    • 2017-03-29
    • 1970-01-01
    相关资源
    最近更新 更多