我试图在管理SQLAlchemy核心连接时减少样板。现在我有这个上下文管理器:
@contextmanager
def conn_manager(conn):
"""Manages transactions and automatically commits, rollbacks and logs"""
log.info("begin")
trans = conn.begin()
try:
yield conn
trans.commit()
except Exception as err:
log.exception("%s: %s", err.__class__.__name__, err)
trans.rollback()
(这只是一个概念验证的存根。我不会在最终版本中捕获异常)
以下是使用它的代码示例:
conn = engine.connect()
clean_session = False
with conn_manager(conn) as conn:
result = conn.execute("select * from users")
for row in result:
print row
clean_session = True
if clean_session:
print "Good"
else:
print "Bad"
这个上下文管理器用于执行数据库CRUD,因此不会总是存在超出上下文管理器范围的值,因此我被迫使用clean_session变量。有更优雅的方式吗?