Обработка сеанса SQLAlchemy в отложенных задачах сельдерея

#session #sqlalchemy #task #celery

#сеанс #sqlalchemy #задача #сельдерей

Вопрос:

Я использую реляционную базу данных через SQLAlchemy. Я хочу создать задание, которое имеет дело с базами данных, использующими сельдерей. Есть код:

 from sqlalchemy.orm.session import Session
from celery.task import task
from myapp.user import User

@task
def job(user):
    # job...
    session = Session.object_session(user)
    with user.begin():
        user.value = result_value

def ordinary_web_request_handler(uid):
    assert isinstance(session, Session)
    user = session.query(User).get(int(uid))
    # deals with user...
    job.delay(user)
    return response
  

Мне нужно использовать сеанс SQLAlchemy в отложенных job , но пока его нет session . Как я могу установить сеанс в переданный user объект?

Я думал, что есть способы, но я не уверен, какой из них (или ни один из них) является лучшей практикой:

  • Всегда передавайте только первичные ключи и извлекайте новые экземпляры по переданным первичным ключам.
  • Установите сеанс для переданных экземпляров (но я не знаю как).
  • Не используйте ORM в отложенной задаче.

Ответ №1:

Вы должны иметь возможность инициировать сеанс с помощью рабочих сигналов:http://celery.readthedocs.org/en/latest/userguide/signals.html#worker-signals

Если вы используете шаблон, подобный singleton, чтобы убедиться, что у вас всегда есть сеанс, доступный в этом потоке, тогда все должно работать просто отлично.