2016-10-26 29 views
1

我正在将Huey与简单的金字塔应用程序集成。我没有在应用程序中使用全局SQLAlchemy会话(我正在使用最新的炼金术脚手架)。但是,似乎没有其他直接的方法来提供定期任务的会话。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是否提供挂钩来关闭任务完成时的数据库连接?为这些任务提供线程安全连接的最佳方式是什么?

在此先感谢!

回答

0

scoped_session为您提供了contextual/thread-local session(即,它对应于每个线程的单独DB连接,而且它也可以configure a custom scope当你需要每个东西单独的会话这不是一个线程。

所以,基本上,所有你需要做的就是拥有一个正确配置的伪全局变量(类似于你现在的变量),并确保你在任务开始时调用DBSession.begin(),并在结束时调用DBSession.commit() - 手动操作可能是一件繁琐的事情,但它可以很容易地抽象为上下文管理器

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

or into a decorator:

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

您可以在任务的工厂建立会话对象:

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

无需使用范围的会议,只是初始化引擎,并把它传递给工厂。