使用to_sql的method='multi'参数写入MS Access触发AttributeError
报错触发原因
- 根本原因是Microsoft Access的Jet/ACE SQL引擎不支持
method='multi'对应的多行批量插入语法。pandas的method='multi'参数会生成INSERT INTO 表名 (字段名) VALUES (值组1),(值组2)...的单条多值插入SQL,该语法仅支持MySQL、PostgreSQL等主流数据库,Access原生不支持。 - 底层异常链路:SQLAlchemy作为pandas
to_sql的底层依赖,尝试为Access方言编译上述不兼容的SQL语句时会抛出CompileError编译异常,后续的异常处理逻辑尝试访问该异常对象不存在的orig属性,最终触发你看到的AttributeError。
可行解决方案
- 方案1:直接移除
method='multi'参数。你已经验证该写法可以正常运行,此时pandas会默认生成单行插入语句执行,完全适配Access的语法要求,数据量较小时优先选择该方案。 - 方案2:使用
pyodbc的executemany方法优化插入性能。如果数据量较大,逐行插入效率太低,可手动实现参数化批量插入,示例代码如下:
import pyodbc import pandas as pd # 替换为你实际的表字段列表 cols = ",".join([f"[{col}]" for col in test_data.columns]) placeholders = ",".join(["?"] * len(test_data.columns)) insert_sql = f"INSERT INTO employee_table ({cols}) VALUES ({placeholders})" # 转换DataFrame为参数元组列表 params = list(test_data.itertuples(index=False, name=None)) # 执行批量插入 cursor = cnxn.cursor() cursor.executemany(insert_sql, params) cnxn.commit() cursor.close()
- 方案3:超大数据量场景下,可先将pandas数据导出为CSV/Excel格式,再使用Access自带的外部数据导入功能批量入库,性能远高于程序逐行插入。
内容的提问来源于stack exchange,提问作者Zanam
相关产品推荐
相关产品推荐

