一些更新模型的函数既可以独立调用(在这种情况下,它们“创建”自己的会话),也可以从也有会话需要的其他函数中调用(在这种情况下,它们将从调用函数)。所以我发现自己经常写类似的东西:
def myfunc(..., session=None):
def my_actualfunc(session):
...
if session:
return my_actualfunc(session)
else:
with session_scope() as session:
return my_actualfunc(session)
我现在将其包装为装饰器:
def embed_session(func):
@functools.wraps(func)
def _wrapper(*args, **kwargs):
if 'session' in kwargs:
return func(*args, **kwargs)
with session_scope() as s:
return func(session=s, *args, **kwargs)
return _wrapper
@embed_session
def my_actualfunc(..., session=None):
...
在我看来,这似乎是一种常见情况,但是我找不到这种用法的引用。我想知道是否遗漏了一些sqlalchemy惯用语。
注意:将会话相互嵌入似乎适用于简单的请求,但是对嵌入式会话的控制不足(例如自动刷新)可能会导致问题。