sqlalchemy-access to_sql追加数据报Table already exists错误
版本测试记录
- 跨版本测试结果:在安装sqlalchemy-access 1.1.2版本的设备上运行写入脚本可正常执行;将原报错设备的sqlalchemy-access从1.1.3版本降级为1.1.2版本时,首次触发如下报错:
NoSuchModuleError: Can't load plugin: sqlalchemy.dialects:access.pyodbc
- 测试变量控制:两台设备操作的是同一份存储在网络驱动器上的Access目标表。
问题场景
使用pandas DataFrame向已存在的MS Access表追加写入数据,核心实现代码如下:
cnn_str = r'Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=C:\data\MyData.accdb;' cnn_url = f"access+pyodbc:///?odbc_connect={urllib.parse.quote_plus(cnn_str)}" acc_engine = create_engine(cnn_url) all_results_df.to_sql('results', acc_engine, if_exists='append')
代码执行过程中抛出错误:
ProgrammingError: ('42S01', "[42S01] [Microsoft][ODBC Microsoft Access Driver] Table 'results' already exists. (-1303) (SQLExecDirectW)")
已在to_sql方法中指定if_exists='append'参数,程序未执行追加逻辑反而触发表已存在报错。
原因与解决方案
该问题由sqlalchemy-access 1.1.3版本的已知bug导致:
- 1.1.3版本中
to_sql方法的表存在性校验逻辑失效,指定if_exists='append'时无法正确识别已存在的目标表,错误执行建表语句,最终触发ODBC驱动返回的表已存在错误。 - 降级到1.1.2版本时出现的
NoSuchModuleError是插件注册缓存未刷新导致,按以下步骤操作即可修复:- 完全卸载当前Python环境中所有已安装的sqlalchemy-access版本,清除残留安装文件
- 重新安装1.1.2版本,安装完成后重启IDE/Python运行环境,让SQLAlchemy重新扫描加载已注册的数据库方言插件
- 额外注意:操作存储在网络驱动器上的Access文件时,需保证运行脚本的系统账户对文件所在目录拥有读写、创建临时文件的权限,权限不足也可能偶发表存在性校验异常。
内容的提问来源于stack exchange,提问作者Nitzan
相关产品推荐
相关产品推荐

