在芹菜中处理SqlAlchemy会话的正确方法

时间:2014-06-28 13:24:38

标签: python sqlalchemy celery

我发现很难理解在Celery中处理会话的正确方法,可能是因为我不太了解它。

假设我的 celery.py 定义如下:

celery.py

from __future__ import absolute_import

from celery import Celery

from sqlalchemy import create_engine
from sqlalchemy.orm import (
    scoped_session,
    sessionmaker,
    )

DBSession = scoped_session(sessionmaker())

from celery.signals import worker_init
@worker_init.connect
def bootstrap(signal, sender):
    engine = create_engine('postgresql://hello:world@localhost/db')
    DBSession.configure(bind=engine)

celery = Celery(include=[
            'tasks',
            ])
celery.config_from_object('celeryconfig')
celery.settings=None

if __name__ == '__main__':
    celery.start()

我不确定是否应该使用scoped_session,我已经看到了一些使用它的样本,但我认为Celery与范围无关?

问题1:我应该使用哪种会话?

问题2:我应该使用siginal worker_init吗?或者只使用模块级会话?

创建会话后,我们如何实际发布/删除/关闭它?

tasks.py

from .celery import celery, DBSession

@celery.task
def do_task():
    DBSession.query(some_object).all()
    #some logics
    DBSession.commit()
    DBSession.remove()

scoped_session会影响使用哪个函数吗?

非常感谢任何帮助。提前谢谢。

0 个答案:

没有答案