pandas to_sql 中的“意外关键字参数 'fetch'”错误的来源?

Posted

技术标签:

【中文标题】pandas to_sql 中的“意外关键字参数 \'fetch\'”错误的来源?【英文标题】:Source of the ' unexpected keyword argument 'fetch' ' error in pandas to_sql?pandas to_sql 中的“意外关键字参数 'fetch'”错误的来源? 【发布时间】:2021-12-16 18:53:21 【问题描述】:

我正在尝试将数据帧上传到 Heroku postgreSQL 服务器,我之前已经成功完成了几次。

这是我的代码,for_db 是我的 Pandas 数据框的名称:

from sqlalchemy import create_engine 

engine = create_engine('postgresql://wgamrest of url',
                       echo=False)
  
# attach the data frame to the sql server 
for_db.to_sql('phil_nlp', 
               con = engine,
              if_exists='replace') 

起初,它无法连接,因为 Heroku 给我的服务器 URL 一开始只有“postgres”,但我知道它必须更改为“postgresql”才能正常工作并且已经克服了最初的错误.

现在我遇到了一个新错误。

/usr/local/lib/python3.7/dist-packages/sqlalchemy/dialects/postgresql/psycopg2.py in do_executemany(self, cursor, statement, parameters, context)
    899                 template=executemany_values,
    900                 fetch=bool(context.compiled.returning),
--> 901                 **kwargs
    902             )
    903 

TypeError: execute_values() got an unexpected keyword argument 'fetch'

我不明白为什么会出现这种情况。显然我从未指定过这样的关键字参数。我做了很多搜索,没有任何好的结果。有谁知道为什么它现在会在上周才起作用的代码中抛出这个错误?

【问题讨论】:

【参考方案1】:

能够通过添加“multi”作为方法参数来解决此问题:

for_db.to_sql('phil_nlp', 
                   con = engine,
                  if_exists='replace',
                  index=False,
                  method='multi') 

仍然不确定是什么导致了错误,但我想问题已经解决了:)

【讨论】:

虽然这适用于您的具体情况,但@jtmolon 的回答给出了一个通用的解决方案(有很好的解释),也许您应该接受他的回答。【参考方案2】:

我在运行DataFrame.to_sql 方法时遇到了同样的问题。添加method='multi' 确实可以使其正常工作,并且是一个很好的解决方法。

进一步调查它原来是我安装的 sqlalchemy 和 psycopg2 版本的问题。这些 github 问题 here 和 here 引导我进行以下操作。

fetch 参数已添加到 psycopg2 version 2.8。我有 2.7 版和 sqlalchemy 1.4.15

安装较新版本即可解决问题,无需添加method='multi' 参数。

pip install psycopg2-binary==2.8.6

希望这有助于其他人发现此问题

【讨论】:

谢谢,它帮助我解决了问题 在我的情况下也有效!荣誉

以上是关于pandas to_sql 中的“意外关键字参数 'fetch'”错误的来源?的主要内容,如果未能解决你的问题,请参考以下文章

pandas.DataFrame.to_sql - 源 csv 文件和目标表的列顺序

pandas to_sql if_exist参数指南

为啥 dask 的“to_sql”比 pandas 花费更多时间?

Pandas DataFrame.to_sql() 函数是不是需要后续的 commit()?

使用 SqlAlchemy 和 cx_Oracle 将 Pandas DataFrame 写入 Oracle 数据库时加快 to_sql()

Pandas 与 to_sql 的 ODBC 连接