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

使用Python向PostgreSQL插入JSON数据时仅插入Null的问题

JSON插入PostgreSQL后显示Null的排查方案
  • 核对JSON数据的传递方式
    别多此一举把Python字典转成字符串再插入。psycopg2原生支持把Python dict直接插入JSON/JSONB列,或者用psycopg2.extras.Json包装更稳妥。
    错误示例(会导致Null):

    import json
    import psycopg2
    
    with open('data.json', 'r') as f:
        # 转成字符串后psycopg2无法识别为JSON对象
        data_str = json.dumps(json.load(f))
    
    conn = psycopg2.connect("dbname=test user=postgres")
    cur = conn.cursor()
    cur.execute("INSERT INTO my_table (json_col) VALUES (%s)", (data_str,))
    conn.commit()
    

    正确示例:

    import json
    import psycopg2
    from psycopg2.extras import Json
    
    with open('data.json', 'r', encoding='utf-8') as f:
        data_dict = json.load(f)
    
    conn = psycopg2.connect("dbname=test user=postgres")
    cur = conn.cursor()
    # 直接传字典,或者用Json包装
    cur.execute("INSERT INTO my_table (json_col) VALUES (%s)", (data_dict,))
    # 或者 cur.execute("INSERT INTO my_table (json_col) VALUES (%s)", (Json(data_dict),))
    conn.commit()
    
  • 排查数据中的非标准JSON值
    Python里的NaN、Infinity这类值不符合JSON标准,psycopg2序列化时可能静默失败导致插入Null。要提前处理这些值:

    def fix_non_json_values(obj):
        if isinstance(obj, float):
            if obj != obj:  # 处理NaN
                return None
            if obj in (float('inf'), float('-inf')):  # 处理正负无穷
                return None
        raise TypeError(f"无法序列化类型: {type(obj)}")
    
    with open('data.json', 'r', encoding='utf-8') as f:
        data_dict = json.load(f)
    
    # 插入时用自定义处理函数
    cur.execute("INSERT INTO my_table (json_col) VALUES (%s)", 
                (Json(data_dict, default=fix_non_json_values),))
    conn.commit()
    
  • 确认事务已提交
    哪怕代码逻辑对,没提交事务的话,查询时看到的就是未持久化的临时数据,表现为Null。务必在插入后调用conn.commit()。

  • 开启调试日志看实际执行的SQL
    加日志能看到psycopg2实际发送给数据库的参数,确认数据有没有正确传递:

    import logging
    logging.basicConfig(level=logging.DEBUG)
    

    运行脚本后,查看日志里的SQL语句和绑定参数,就能知道是不是参数传递环节出了问题。

  • 检查文件编码与读取方式
    如果JSON文件包含非ASCII字符,读取时没指定编码可能导致解析出异常数据,最终插入Null。读取文件时明确指定encoding='utf-8'。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 13:45:53