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

AWS Glue执行df.to_sql写入PostgreSQL时出现数值范围格式错误求助

解决AWS Glue中df.to_sql导入PostgreSQL时的'h' format requires -32768 <= number <= 32767错误

这个错误的核心原因是数据类型不匹配:PostgreSQL的smallint类型(对应格式符'h')取值范围被限制在-32768到32767之间,但你的DataFrame里有超出该范围的数值,写入时触发了类型校验失败。

以下是具体处理方案:

  • 定位问题列:先找出DataFrame中哪些列的数值超出smallint范围,用这段代码快速排查:

    # 遍历所有数值型列,检查范围
    for col in df.columns:
        if df[col].dtype in ['int16', 'int32', 'int64']:
            min_val = df[col].min()
            max_val = df[col].max()
            if min_val < -32768 or max_val > 32767:
                print(f"列 {col} 超出smallint范围: 最小值={min_val}, 最大值={max_val}")
    
  • 调整DataFrame数据类型:把超出范围的列从int16(对应PostgreSQL的smallint)改成int32或int64,对应PostgreSQL的integer或bigint:

    # 将问题列转换为int32类型
    df['问题列名'] = df['问题列名'].astype('int32')
    
  • 显式指定to_sql的dtype映射:如果不想修改DataFrame本身,可在to_sql时强制指定列对应的PostgreSQL类型,避开smallint的限制:

    from sqlalchemy import types
    
    # 定义列类型映射,把问题列指定为integer
    dtype_mapping = {
        '问题列名': types.Integer()
    }
    
    df.to_sql(
        name='目标表名',
        con=你的数据库连接对象,
        if_exists='append',  # 根据需求选择replace/append等
        dtype=dtype_mapping
    )
    
  • 修改PostgreSQL目标表结构:直接把目标表中对应列的类型从smallint改成integer或bigint,从根源解决范围限制:

    ALTER TABLE 目标表名 ALTER COLUMN 问题列名 TYPE integer;
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 04:05:24