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

