Python如何用函数返回多上下文管理器供with语句复用?
简化psycopg2事务与游标上下文管理的方案
直接返回元组的方式无法生效,因为with语句需要的是上下文管理器对象,而非普通元组。要实现简化,你可以借助contextlib.contextmanager装饰器,将con和cursor的上下文逻辑封装成一个可复用的函数:
实现代码
from contextlib import contextmanager import psycopg2 # 初始化数据库连接 con = psycopg2.connect( dbname="your_db", user="your_user", password="your_pwd", host="your_host" ) @contextmanager def db_cursor(cursor_factory=None, **cursor_kwargs): # 嵌套上下文:先处理连接的事务管理,再处理游标生命周期 with con: with con.cursor(cursor_factory=cursor_factory, **cursor_kwargs) as cur: yield cur
使用方式
调用这个函数就能替代重复的with con, con.cursor()代码,同时支持传递cursor_factory等游标参数:
# 基础用法 with db_cursor() as c: c.execute("INSERT INTO users (name) VALUES (%s);", ("Alice",)) # 带自定义游标工厂的用法 with db_cursor(cursor_factory=psycopg2.extras.DictCursor) as c: c.execute("SELECT * FROM users WHERE name = %s;", ("Alice",)) result = c.fetchone() print(result["name"])
逻辑说明
- 外层
with con负责事务的自动提交/回滚:如果with块正常执行,事务会自动提交;如果抛出异常,事务会回滚。 - 内层
with con.cursor(...)负责游标自动关闭,避免资源泄漏。 yield cur将游标对象返回给with语句的as变量,让你能直接在块内执行SQL操作。
内容的提问来源于stack exchange,提问作者LinG
相关产品推荐
相关产品推荐

