我面临一个问题,相同的代码在 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
我确认 DataFrame 中没有
NaN
值,只有 None
。
我尝试使用
NaN
将 None
转换为 df_score = df_score.where(pd.notnull(df_score), None)
但仍然收到错误。
以前有人遇到过这个问题吗?或者有人可以建议在 Linux 上可能导致此问题的原因吗?
我想出了如何解决这个问题。该问题可以通过将pandas版本降级到1.2.5或更低版本来解决。任何高于 1.2.5 的版本似乎都会导致失败。但是,我不确定为什么会发生这种情况。
如果有人知道为什么高于 1.2.5 的 pandas 版本可能会导致此问题,我将不胜感激任何解释或建议。
以下是降级 pandas 的方法:
pip uninstall pandas
pip install pandas==1.2.5
降级后,代码应该可以在 Windows 和 Linux 上按预期运行。