相同的代码在 Windows 上运行,但在 Linux 上失败:pymysql.err.ProgrammingError: nan 不能与 MySQL 一起使用

问题描述 投票:0回答:1

我面临一个问题,相同的代码在 Windows 上运行良好,但在 Linux 上失败并出现错误:

pymysql.err.ProgrammingError: nan can not be used with MySQL

在我的项目中,我计算结果,将它们存储在 pandas

DataFrame
中,将其转换为列表,然后使用
pymysql
将数据插入 MySQL。代码如下所示:

df_score = DataFrame()
temp = df_score.values.tolist()
insert(REPORT, report_cursor, insert_score.format(suffix), temp)

在 Windows 上,此代码可以完美运行。然而,当我在Linux上运行它时,遇到了上面提到的错误。我检查了

DataFrame
,它不包含任何
NaN
值,仅包含
None
。我什至尝试使用以下方法将
NaN
值替换为
None

df_score = df_score.where(pd.notnull(df_score), None)

但是错误仍然存在。

环境详情:

  • Python版本:3.8.10

  • 操作系统版本:Ubuntu 18.04

  • 熊猫版本:2.0.3

  • pymysql版本:1.1.1

完整的错误回溯:

Traceback (most recent call last):
  File "/root/analysis/./dataAnalysisApp/service.py", line 3872, in score
    insert(REPORT, report_cursor, insert_score.format(suffix), temp)
  File "/root/analysis/./utils/mysql_db_pools.py", line 207, in insert
    db_pools.execute_sql(db_name, cursor, sql, params, fetch, executemany)
  File "/root/analysis/./utils/mysql_db_pools.py", line 91, in execute_sql
    raise e
  File "/root/analysis/./utils/mysql_db_pools.py", line 82, in execute_sql
    cursor.executemany(sql, params or ())
  File "/root/anaconda3/envs/analysis-py38/lib/python3.8/site-packages/dbutils/steady_db.py", line 605, in tough_method
    result = method(*args, **kwargs)  # try to execute
  File "/root/anaconda3/envs/analysis-py38/lib/python3.8/site-packages/pymysql/cursors.py", line 182, in executemany
    return self._do_execute_many(
  File "/root/anaconda3/envs/analysis-py38/lib/python3.8/site-packages/pymysql/cursors.py", line 211, in _do_execute_many
    v = values % escape(arg, conn)
  File "/root/anaconda3/envs/analysis-py38/lib/python3.8/site-packages/pymysql/cursors.py", line 102, in _escape_args
    return tuple(conn.literal(arg) for arg in args)
  File "/root/anaconda3/envs/analysis-py38/lib/python3.8/site-packages/pymysql/cursors.py", line 102, in <genexpr>
    return tuple(conn.literal(arg) for arg in args)
  File "/root/anaconda3/envs/analysis-py38/lib/python3.8/site-packages/pymysql/connections.py", line 530, in literal
    return self.escape(obj, self.encoders)
  File "/root/anaconda3/envs/analysis-py38/lib/python3.8/site-packages/pymysql/connections.py", line 523, in escape
    return converters.escape_item(obj, self.charset, mapping=mapping)
  File "/root/anaconda3/envs/xjy-data-analysis-py38/lib/python3.8/site-packages/pymysql/converters.py", line 25, in escape_item
    val = encoder(val, mapping)
  File "/root/anaconda3/envs/xjy-data-analysis-py38/lib/python3.8/site-packages/pymysql/converters.py", line 56, in escape_float
    raise ProgrammingError("%s can not be used with MySQL" % s)
pymysql.err.ProgrammingError: nan can not be used with MySQL
  1. 我确认 DataFrame 中没有

    NaN
    值,只有
    None

  2. 我尝试使用

    NaN
    None
    转换为
    df_score = df_score.where(pd.notnull(df_score), None)
    但仍然收到错误。

以前有人遇到过这个问题吗?或者有人可以建议在 Linux 上可能导致此问题的原因吗?

python mysql pandas pymysql
1个回答
0
投票

我想出了如何解决这个问题。该问题可以通过将pandas版本降级到1.2.5或更低版本来解决。任何高于 1.2.5 的版本似乎都会导致失败。但是,我不确定为什么会发生这种情况。

如果有人知道为什么高于 1.2.5 的 pandas 版本可能会导致此问题,我将不胜感激任何解释或建议。

以下是降级 pandas 的方法:

pip uninstall pandas
pip install pandas==1.2.5

降级后,代码应该可以在 Windows 和 Linux 上按预期运行。

© www.soinside.com 2019 - 2024. All rights reserved.