#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, чтобы убедиться, что у вас всегда есть сеанс, доступный в этом потоке, тогда все должно работать просто отлично.