执行df.to_sql遇TypeError:has_table()参数'info_cache'异常求助
解决df.to_sql连接MS Access时的TypeError: has_table() got an unexpected keyword argument 'info_cache'问题
错误原因
这个错误是由于SQLAlchemy 2.x版本与MS Access的SQLAlchemy方言(access+pyodbc)不兼容导致的。SQLAlchemy 2.x在检查表是否存在时新增了info_cache参数,但Access对应的方言实现并未适配该参数,从而触发报错。
解决方案
方案1:降级SQLAlchemy到1.4.x稳定版
这是最直接的解决方法,1.4.x版本的has_table()方法不包含info_cache参数,能避开兼容性问题:
pip install sqlalchemy==1.4.49
之后使用正确的连接与追加代码:
import pandas as pd from sqlalchemy import create_engine # 读取CSV数据 df = pd.read_csv("your_data.csv") # 构建MS Access连接字符串(替换为你的数据库路径) conn_str = ( r'DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};' r'DBQ=C:\your_path\your_database.accdb;' ) engine = create_engine(f"access+pyodbc:///?odbc_connect={conn_str}") # 追加数据到已有表 df.to_sql( name="your_table_name", # 替换为目标表名 con=engine, if_exists="append", # 追加模式 index=False # 不写入DataFrame索引 )
方案2:绕过SQLAlchemy,直接用pyodbc批量插入
如果不想调整SQLAlchemy版本,可以直接使用pyodbc执行批量插入,避开SQLAlchemy的表检查逻辑:
import pandas as pd import pyodbc # 读取CSV数据 df = pd.read_csv("your_data.csv") # 连接MS Access数据库 conn = pyodbc.connect( r'DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};' r'DBQ=C:\your_path\your_database.accdb;' ) cursor = conn.cursor() # 生成插入语句(假设DataFrame列名与数据库表列名完全一致) columns = ", ".join(df.columns) placeholders = ", ".join(["?"] * len(df.columns)) insert_sql = f"INSERT INTO your_table_name ({columns}) VALUES ({placeholders})" # 批量插入数据 cursor.executemany(insert_sql, df.values.tolist()) conn.commit() # 关闭连接 cursor.close() conn.close()
注意事项
- 确保你的系统安装了Microsoft Access ODBC驱动(32位/64位需与Python版本匹配)。
- 目标表的列名、数据类型需与CSV数据的列名、类型匹配,避免插入失败。
内容的提问来源于stack exchange,提问作者user11956646
相关产品推荐
相关产品推荐

