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(...)
我正在将 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(...)