使用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
相关产品推荐
相关产品推荐

