如何用Pandas DataFrame填充含自动编号与默认值列的MS Access表?
解决Pandas往Access表插入数据时自动编号和默认时间列的类型不匹配问题
我来帮你搞定这个问题!你遇到的DataError类型不匹配错误,根源在于你给Access的自动编号列(ID)和默认时间列(RowInsertedTime)传了空字符串''——这俩字段根本不需要你手动赋值,数据库会自动生成对应的值。
核心解决方案:省略不需要手动赋值的列
Access的自动编号列会自动生成递增的整数,默认值为now()的列会自动填充当前时间,所以我们只需要插入自己有数据的列即可:
- 调整你的DataFrame,移除不需要手动赋值的ID和RowInsertedTime列:
d = {'col1': [1, 2], 'col2': [3, 4]} df = pd.DataFrame(data=d)
- 修改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
相关产品推荐
相关产品推荐

