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

Python通过SSH隧道连接PostgreSQL后返回None问题排查

问题分析与修正方案

核心错误点

  • 变量覆盖导致逻辑混乱
    你在创建数据库连接后,直接将conn变量重新赋值为游标对象:

    conn = psycopg2.connect(**params)
    conn = conn.cursor()  # 此处覆盖了原连接对象
    

    这会混淆连接与游标对象的职责,后续无法对数据库连接进行正确操作。

  • 对execute()方法返回值的误解
    cursor.execute()执行SQL语句后不会返回结果集对象,它的返回值固定为None。你将该返回值赋值给curs,自然会得到None。正确的做法是通过游标对象本身获取查询结果。


修正后的代码示例

with SSHTunnelForwarder(
        (ssh_host, ssh_port),
        ssh_username=ssh_user,
        ssh_password=ssh_password, 
        remote_bind_address=(sql_hostname, 5432)
        ) as server:
        server.start()
        print("server connected")

        params = {
            'host': 'localhost',
            'port': server.local_bind_port,
            'user': sql_username,
            'password': sql_password,
            'database': sql_database
            }

        # 保留连接对象,单独创建游标
        conn = psycopg2.connect(**params)
        curs = conn.cursor()

        # 执行SQL,无需接收返回值
        curs.execute("SELECT VERSION();")
        # 从游标直接获取结果
        result = curs.fetchall()
        print(result)

        # 按顺序关闭游标与连接
        curs.close()
        conn.close()
        print("database disconnected")

优化建议

可以使用上下文管理器自动管理连接与游标,避免手动关闭时出现遗漏:

with SSHTunnelForwarder(
        (ssh_host, ssh_port),
        ssh_username=ssh_user,
        ssh_password=ssh_password, 
        remote_bind_address=(sql_hostname, 5432)
        ) as server:
        server.start()
        print("server connected")

        params = {
            'host': 'localhost',
            'port': server.local_bind_port,
            'user': sql_username,
            'password': sql_password,
            'database': sql_database
            }

        # 上下文管理器自动关闭连接
        with psycopg2.connect(**params) as conn:
            # 上下文管理器自动关闭游标
            with conn.cursor() as curs:
                curs.execute("SELECT VERSION();")
                result = curs.fetchall()
                print(result)
        
        print("database disconnected")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 11:33:01