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

