Huey定期任务中的SQLAlchemy会话

时间:2016-10-26 02:18:24

标签: sqlalchemy pyramid python-huey

我正在将Huey与简单的金字塔应用集成在一起。我没有在应用程序中使用全局SQLAlchemy会话(我正在使用最新的炼金术脚手架)。但是,似乎没有其他直接的方法来为周期性任务提供会话。

from huey import RedisHuey

huey = RedisHuey(password=os.environ.get('REDIS_PASSWORD', ''))
DBSession = scoped_session(sessionmaker())


@huey.periodic_task(crontab(minute='*/1'))
def notify_not_confirmed_assignments():
    # TODO: Use a non-global DB session
    assignments = DBSession.query(Assignment).filter_by(date=next_date).all()

Huey是否提供挂钩以在任务完成时关闭数据库连接?为这些任务提供线程安全连接的最佳方法是什么?

提前致谢!

2 个答案:

答案 0 :(得分:1)

您可以在任务中使用工厂构建会话对象:

def identity(n):
    m=[[0 for x in range(n)] for y in range(n)]
    for i in range(0,n):
        m[i][i] = 1
    return m

无需使用作用域会话,只需初始化引擎并将其传递给工厂。

答案 1 :(得分:0)

scoped_session为您提供contextual/thread-local session(即它对应于每个线程中的单个数据库连接,当您需要单独的会话时,也可以configure a custom scope不是一个主题。

所以,基本上,你需要做的就是拥有一个配置正确的伪全局变量(类似于你现在拥有的变量),并确保在任务和DBSession的开头调用DBSession.begin()。最后的commit() - 手动执行该操作可能是一件苦差事,但它可以很容易地抽象到上下文管理器中

def my_task():
    with magically_start_session() as session:
        session.query(...)

或装饰者:

@huey.periodic_task(crontab(minute='*/1'))
@start_session
def notify_not_confirmed_assignments(session):
    # TODO: Use a non-global DB session
    assignments = session.query(...)