You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

执行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 22:45:30