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

如何用Pandas DataFrame填充含自动编号与默认值列的MS Access表?

解决Pandas往Access表插入数据时自动编号和默认时间列的类型不匹配问题

我来帮你搞定这个问题!你遇到的DataError类型不匹配错误,根源在于你给Access的自动编号列(ID)和默认时间列(RowInsertedTime)传了空字符串''——这俩字段根本不需要你手动赋值,数据库会自动生成对应的值。

核心解决方案:省略不需要手动赋值的列

Access的自动编号列会自动生成递增的整数,默认值为now()的列会自动填充当前时间,所以我们只需要插入自己有数据的列即可:

  1. 调整你的DataFrame,移除不需要手动赋值的ID和RowInsertedTime列:
d = {'col1': [1, 2], 'col2': [3, 4]}
df = pd.DataFrame(data=d)
  1. 修改INSERT语句,只列出需要插入数据的列(col1、col2):
connection_string = (
    r'DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};'
    r'DBQ=C:\Users\Public\MyTest.accdb;'
)
cnxn = pyodbc.connect(connection_string, autocommit=True)
crsr = cnxn.cursor()

# 只插入col1和col2,让Access自动处理ID和RowInsertedTime
crsr.executemany(
    f"INSERT INTO [{table_name}] (col1, col2) VALUES (?, ?)",
    df.itertuples(index=False)
)

# 记得关闭游标和连接(可选,但好习惯)
crsr.close()
cnxn.close()

特殊场景:必须保留DataFrame中的ID和RowInsertedTime列

如果因为上游逻辑需要,你必须保留这两个列在DataFrame里,那可以把它们的值设为None(而非空字符串),并在SQL语句中用DEFAULT关键字让数据库使用默认值:

d = {'ID': [None, None], 'col1': [1, 2], 'col2': [3, 4], 'RowInsertedTime': [None, None]}
df = pd.DataFrame(data=d)

crsr.executemany(
    f"INSERT INTO [{table_name}] (col1, col2, ID, RowInsertedTime) VALUES (?, ?, DEFAULT, DEFAULT)",
    df[['col1', 'col2']].itertuples(index=False)
)

不过这种方式比较冗余,更推荐第一种直接省略不必要列的方案,代码更简洁也更不容易出错。

错误原因说明

Access的自动编号列是整数类型,默认时间列是日期/时间类型,你传入的空字符串''和这两种数据类型完全不兼容,数据库无法完成类型转换,所以抛出了DataError: 数据类型不匹配的错误。只要不让这两个字段接收错误类型的值,或者干脆不指定它们,数据库就会自动生成正确的内容啦。

内容的提问来源于stack exchange,提问作者Mtra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:08:08