Huey 周期性任务中的 SQLAlchemy 会话

SQLAlchemy session within Huey periodic task

我正在将 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 是否提供挂钩以在任务完成时关闭数据库连接?为这些任务提供线程安全连接的最佳方式是什么?

提前致谢!

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

factory = sessionmaker()
factory.configure(bind=engine)
session = factory()

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

scoped_session 为您提供 contextual/thread-local session (i.e. it corresponds to an individual DB connection in each thread, and it's also possible to configure a custom scope 当您需要每个不是线程的事物的单独会话时。

所以,基本上,您需要做的就是拥有一个正确配置的伪全局变量(类似于您现在拥有的)并确保在开始时调用 DBSession.begin()任务和最后的 DBSession.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(...)