python - SQLAlchemy returns stale data in celery tasks -
my current setup include
flask, flask-sqlalchemy, celery
now problem running database queries inside celery tasks gives stale data i.e if ask last record table second last while last entry inserted 10-15 minutes before doing query , see exceptions these.
operationalerror("(operationalerror) (2006, \'mysql server has gone away\')",)'
following trackback
file "/home/sys_user/repo/my_app/app/tasks/reminders.py", line 63, in run config = reminder.query.filter_by(id=reminder_id).first() file "/home/sys_user/envs/flask/local/lib/python2.7/site-packages/sqlalchemy/orm/query.py", line 2341, in first ret = list(self[0:1]) file "/home/sys_user/envs/flask/local/lib/python2.7/site-packages/sqlalchemy/orm/query.py", line 2208, in __getitem__ return list(res) file "/home/sys_user/envs/flask/local/lib/python2.7/site-packages/sqlalchemy/orm/query.py", line 2412, in __iter__ return self._execute_and_instances(context) file "/home/sys_user/envs/flask/local/lib/python2.7/site-packages/sqlalchemy/orm/query.py", line 2427, in _execute_and_instances result = conn.execute(querycontext.statement, self._params) file "/home/sys_user/envs/flask/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 729, in execute return meth(self, multiparams, params) file "/home/sys_user/envs/flask/local/lib/python2.7/site-packages/sqlalchemy/sql/elements.py", line 321, in _execute_on_connection return connection._execute_clauseelement(self, multiparams, params) file "/home/sys_user/envs/flask/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 826, in _execute_clauseelement compiled_sql, distilled_params file "/home/sys_user/envs/flask/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 958, in _execute_context context) file "/home/sys_user/envs/flask/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1160, in _handle_dbapi_exception exc_info file "/home/sys_user/envs/flask/local/lib/python2.7/site-packages/sqlalchemy/util/compat.py", line 199, in raise_from_cause reraise(type(exception), exception, tb=exc_tb) file "/home/sys_user/envs/flask/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 951, in _execute_context context) file "/home/sys_user/envs/flask/local/lib/python2.7/site-packages/sqlalchemy/engine/default.py", line 436, in do_execute cursor.execute(statement, parameters) file "/home/sys_user/envs/flask/local/lib/python2.7/site-packages/mysqldb/cursors.py", line 205, in execute self.errorhandler(self, exc, value) file "/home/sys_user/envs/flask/local/lib/python2.7/site-packages/mysqldb/connections.py", line 36, in defaulterrorhandler raise errorclass, errorvalue following celery_app.py
from app import app flask_app, db celery.signals import worker_process_init def make_celery(app=none): celery = celery() celery.conf.update(flask_app.config) celery.config_from_object(celeryconfig) taskbase = celery.task class contexttask(taskbase): abstract = true def __call__(self, *args, **kwargs): flask_app.app_context(): return taskbase.__call__(self, *args, **kwargs) db.init_app(flask_app) celery.task = contexttask return celery celery_instance = make_celery() @worker_process_init.connect def celery_worker_init_db(**_): db.init_app(flask_app) some tasks defined.
class remindertask(task): ignore_result = true def run(self, data): = reminder.query.filter_by(id=int(data['reminder_id'])).first() a.send_reminders()
this same question got answered @ sqlalchemy google group
based on ended implementing solution ask mentions here. haven't seen these issues since then.
Comments
Post a Comment