You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas保存DataFrame到MySQL时series_id列值异常转换问题排查

问题:Pandas保存DataFrame到MySQL时series_id被强制转为2147483647

表结构定义

CREATE TABLE series_info (
    series_id INT NOT NULL PRIMARY KEY,
    s_area VARCHAR(40) NOT NULL,
    s_code VARCHAR(10) NOT NULL,
    dataset_version VARCHAR(20) NOT NULL
);

Python代码片段

# 向df_series_info插入3条记录

conn = sqlalchemy.create_engine( \
    f"mysql+mysqlconnector://{DATABASER_USER}:{DATABASER_PASSWORD}@{DATABASE_HOST}/{DATABASE}")

print(df_series_info.dtypes)
print(df_series_info.head())
df_series_info.to_sql(name='series_info', con=conn, if_exists='append', index=False)

问题现象

执行代码后触发主键重复错误,提示2147483647重复,但DataFrame中series_id的实际值远大于该数值。若移除PRIMARY KEY约束,代码可正常运行,但所有行的series_id均被替换为2147483647。


问题原因与解决办法
  • 核心原因:数据类型范围不匹配
    MySQL的INT类型是32位有符号整数,最大值为2147483647。当DataFrame中的series_id数值超过这个上限时,mysqlconnector会将超出范围的数值强制截断为INT类型的最大值,进而导致主键重复或所有值被统一替换。

  • 解决步骤

    1. 修改MySQL表字段类型:将series_id改为BIGINT(64位有符号整数,最大值为9223372036854775807),足以容纳更大的数值:
      ALTER TABLE series_info MODIFY COLUMN series_id BIGINT NOT NULL PRIMARY KEY;
      
    2. 统一DataFrame字段类型:确保DataFrame中series_id列的类型为int64,避免隐式转换问题:
      df_series_info['series_id'] = df_series_info['series_id'].astype('int64')
      
    3. 重新执行写入操作:此时超出原INT范围的数值会被正确写入,主键重复问题也会消失。

内容的提问来源于stack exchange,提问作者chrx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 17:10:20