执行Python代码向MySQL插入数据报错Unknown column 'nan'如何解决
报错原因与解决方案
错误根因
mysql.connector.errors.ProgrammingError: 1054 (42S22): Unknown column 'nan' in 'field list' 报错的核心逻辑是:
Pandas里的缺失值 NaN 传入MySQL连接器时,没有被转换为SQL标准空值 NULL,而是被解析为未加单引号的字符串nan,MySQL语法解析时会把未加引号的标识符识别为字段名,找不到nan字段就触发了该报错。
修复方案
方案1:逐行插入前先替换NaN为None
Python的None会被mysql-connector自动识别为MySQL的NULL,先统一处理DataFrame的缺失值即可:
# 新增这一行:将所有NaN替换为None dfp = dfp.where(pd.notnull(dfp), None) # 原有插入逻辑不变 for row in dfp.itertuples(): cursor.execute(''' INSERT INTO players (PID, NAME) VALUES (%s,%s) ''', (row.PID, row.NAME) )
方案2:使用批量插入提升效率
数据量较大时避免逐行遍历,用executemany批量操作:
# 提取需要插入的列,替换NaN为None,转成列表格式 insert_data = dfp[['PID', 'NAME']].where(pd.notnull(dfp[['PID', 'NAME']]), None).values.tolist() # 批量插入 cursor.executemany(''' INSERT INTO players (PID, NAME) VALUES (%s, %s) ''', insert_data)
可选处理:非空字段的缺失值填充
如果你的PID或NAME字段在MySQL表中设置了NOT NULL约束,插入NULL会触发新的报错,可提前填充缺失值:
# 字符串类型NAME填充默认值 dfp['NAME'] = dfp['NAME'].fillna('未录入') # 数字类型PID填充默认值 dfp['PID'] = dfp['PID'].fillna(0)
内容的提问来源于stack exchange,提问作者user15802129
相关产品推荐
相关产品推荐

