SQLAlchemy:对函数可以传递或创建会话的模式进行

时间:2018-07-09 08:42:16

标签: python sqlalchemy

一些更新模型的函数既可以独立调用(在这种情况下,它们“创建”自己的会话),也可以从也有会话需要的其他函数中调用(在这种情况下,它们将从调用函数)。所以我发现自己经常写类似的东西:

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惯用语。

注意:将会话相互嵌入似乎适用于简单的请求,但是对嵌入式会话的控制不足(例如自动刷新)可能会导致问题。

0 个答案:

没有答案