2016-10-26 43 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() 

無需使用範圍的會議,只是初始化引擎,並把它傳遞給工廠。