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

使用psycopg2查询PostgreSQL的json类型列时execute()挂起

解决psycopg2查询JSON列挂起的方案
  • 检查psycopg2与PostgreSQL版本兼容性
    不同版本的psycopg2对JSON类型的处理可能存在差异,尤其是PostgreSQL版本较新但psycopg2版本过旧时,易出现解析阻塞。执行pip show psycopg2-binary(或psycopg2)查看当前版本,升级到最新稳定版:pip install --upgrade psycopg2-binary。

  • 手动控制事务状态
    异常的事务状态可能导致查询看似挂起。尝试关闭自动提交,手动管理事务:

    conn.autocommit = False
    try:
        cur.execute("SELECT data FROM public.config WHERE account_name = %s LIMIT 1;", [accountName])
        result = cur.fetchone()
        conn.commit()
    except Exception as e:
        conn.rollback()
        raise e
    
  • 排查JSON列数据异常
    psycopg2的JSON解析逻辑可能对特殊格式更敏感。先在pgAdmin导出目标data列内容,检查是否有未闭合引号、特殊字符或嵌套过深结构。尝试转换为jsonb类型查询:SELECT data::jsonb FROM public.config WHERE account_name = %s LIMIT 1;,再在Python中接收数据。

  • 使用服务器端游标
    若JSON数据体积较大,默认客户端游标可能引发传输阻塞。创建服务器端游标尝试:

    cur = conn.cursor(name='server_side_cursor')
    cur.execute("SELECT data FROM public.config WHERE account_name = %s LIMIT 1;", [accountName])
    result = cur.fetchone()
    
  • 排查Python进程IO阻塞
    ClientRead状态说明PostgreSQL已返回结果,但客户端未读取。可能是Python进程被其他IO操作(文件读写、网络请求)占用,单独测试这段查询代码,排除其他代码干扰。

  • 禁用自动JSON解析
    关闭psycopg2的自动JSON解析,获取原始字符串后自行处理:

    import psycopg2.extensions
    import json
    
    psycopg2.extensions.register_type(psycopg2.extensions.UNICODE, cur)
    psycopg2.extensions.register_type(psycopg2.extensions.UNICODEARRAY, cur)
    
    cur.execute("SELECT data FROM public.config WHERE account_name = %s LIMIT 1;", [accountName])
    result = cur.fetchone()
    if result:
        data = json.loads(result[0])
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 21:37:01