Python中PostgreSQL连接复用优化:避免多次连接断开问题
你的修改思路完全正确,但有几处细节需要修正
首先要给你点个赞——你的核心思路完全命中了问题的痛点:把连接建立和数据查询的逻辑拆分开,实现连接复用,彻底解决了原代码每次查询都重复创建/关闭连接的性能问题,完全符合你想要的「先指定数据库连接、多次执行查询、最后统一关闭」的使用模式。
不过你的修改代码里存在几处小问题,会导致运行出错,我帮你梳理并修正:
1. 变量名拼写错误
在修改后的get_data函数中,你把参数名定义为cursor,但函数内部却误用了xcurs,这会直接抛出NameError。修正后的get_data应该是:
def get_data(cursor, query): try: cursor.execute(query) df = pd.DataFrame(cursor.fetchall()) colnames = [desc[0] for desc in cursor.description] df.columns = colnames return df except (Exception, psycopg2.DatabaseError) as error: print(f"查询执行出错: {error}") # 可选:如果需要回滚当前连接的未提交操作,可添加下面一行 # cursor.connection.rollback() return None
2. 缺失异常处理逻辑
原代码的get_data包含异常捕获,但修改后的版本去掉了这部分。如果某个查询执行失败(比如SQL语法错误、数据库连接中断),会直接导致整个程序崩溃。上面的修正代码已经补回了异常捕获,同时可选添加回滚操作,避免连接处于异常状态影响后续查询。
3. 原代码的隐藏语法错误
顺便提一下:你原config函数的第一行语法有问题,filename='config.ini', section=get_section(a)这种写法在Python里是非法的,应该拆成两行赋值:
def config(a): filename = 'config.ini' section = get_section(a) # 后续代码保持不变...
额外优化建议(可选)
如果你想进一步简化连接的管理,避免忘记手动调用close()导致资源泄漏,可以用Python的上下文管理器(with语句)来封装连接:
def get_connection(a): try: params = config(a) print(f'Connecting to {get_section(a)}') conn = psycopg2.connect(**params) print('Connected') return conn except (Exception, psycopg2.DatabaseError) as error: print(error) raise # 调用方式变成: with get_connection(1) as conn: with conn.cursor() as curs: df1 = get_data(curs, query1) df2 = get_data(curs, query2) # 当with块结束时,游标和连接会自动关闭,无需手动调用close()
总的来说,你的修改方向完全正确,只要修正上述细节,就能完美实现你想要的复用数据库连接的需求。
内容的提问来源于stack exchange,提问作者Karanam Krishna
相关产品推荐
相关产品推荐

