首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MS Access Pandas dataframe to_sql抛出无效的精度值

MS Access Pandas dataframe to_sql抛出无效的精度值
EN

Stack Overflow用户
提问于 2020-10-03 17:25:54
回答 1查看 251关注 0票数 1

我使用pandas dataframe的to_sql函数将记录保存到MS Access 97MDB。但是我得到了下面的错误:

代码语言:javascript
复制
pyodbc.Error: ('HY104', '[HY104] [Microsoft][ODBC Microsoft Access Driver]Invalid 
precision value  (98) (SQLBindParameter)').

我在Windows 10工作站上使用Python 3.8.5 32位。

我还安装了以下库。

代码语言:javascript
复制
datacompy==0.7.1
et-xmlfile==1.0.1
jdcal==1.4.1
numpy==1.19.2
openpyxl==3.0.5
pandas==1.1.2
pyodbc==4.0.30
python-dateutil==2.8.1
pytz==2020.1
pywin32==228
six==1.15.0
SQLAlchemy==1.3.19
sqlalchemy-access==1.0.7

提前感谢!

EN

回答 1

Stack Overflow用户

发布于 2020-10-04 00:42:23

在处理Access_97数据库文件时,您遇到了Access ODBC驱动程序的限制。在Python_3中,所有字符串都是Unicode,但Access直到Access_2000才开始支持Unicode。

此代码失败,并显示您所描述的错误

代码语言:javascript
复制
num_characters = 128
df = pd.DataFrame(
    [
        (
            1,
            "x" * num_characters,
        )
    ],
    columns=["ID", "TextField"],
)
df.to_sql("sa_a_test", engine, index=False, if_exists="append")

使用Access_97 (Jet 3.5) .mdb文件时,num_characters值大于127。使用Access_2000 (Jet4.0) .mdb文件时,相同的代码不会失败。

作为一种变通办法,您可以使用如下所示的内容

代码语言:javascript
复制
cnxn = engine.raw_connection()
crsr = cnxn.cursor()
sql = "INSERT INTO [sa_a_test] ([ID],[TextField]) VALUES (?,?)"
crsr.setinputsizes([(pyodbc.SQL_INTEGER,), (pyodbc.SQL_LONGVARCHAR,)])
crsr.executemany(sql, df.itertuples(index=False))
cnxn.commit()

但更好的解决方案是将数据库文件升级到较新的版本。Access_97文件格式已被弃用多年,现在是完全不受微软支持的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64182667

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档