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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 08:08:11