[英]Celery with Flask and Flask-SQLAlchemy cannot update a database record
我正在使用Flask和Flask-SQLAlchemy创建一个背景芹菜任务来更新数据库记录的属性。 我正在使用celery配置的推荐文档 ,这是我的代码的简化版本:
from flask import Flask
from celery import Celery
def make_celery(app):
celery = Celery(app.import_name, broker=app.config['CELERY_BROKER_URL'])
celery.conf.update(app.config)
TaskBase = celery.Task
class ContextTask(TaskBase):
abstract = True
def __call__(self, *args, **kwargs):
with app.app_context():
return TaskBase.__call__(self, *args, **kwargs)
celery.Task = ContextTask
return celery
app = Flask(__name__)
celery = make_celery(app)
class Stuff(db.Model):
id = db.Column(db.Integer, primary_key=True)
processed = db.Column(db.Boolean)
@celery.task()
def process_stuff(stuff_id):
stuff = Stuff.query.get(stuff_id)
print("stuff.processed 1: {}".format(stuff.processed))
stuff.processed = True
print("stuff.processed 2: {}".format(stuff.processed))
db.session.add(stuff)
db.session.commit()
print("stuff.processed 3: {}".format(stuff.processed))
@app.route("/process_stuff/<id>")
def do_process_stuff(id):
stuff = Stuff.query.get_or_404(id)
process_stuff.delay(stuff.id)
return redirect(url_for("now_wait"))
这是print语句的输出:
[2017-07-11 07:32:01,281: WARNING/PoolWorker-4] stuff.processed 1: False
[2017-07-11 07:32:01,282: WARNING/PoolWorker-4] stuff.processed 2: False
[2017-07-11 07:32:01,285: WARNING/PoolWorker-4] stuff.processed 3: False
我可以在我的芹菜工人日志中看到任务正在被接收和完成; 但是,print语句显示stuff.processed
属性总是错误 - 即使在我手动更新之后print语句也永远不会显示True(我在芹菜之外测试了这个,我可以更新属性)。
这里有一个非常类似的问题,但该解决方案对我的情况不起作用
库版本
更新
其他测试显示我可以创建新的对象并将其持久保存到数据库中 - 更新预先存在的对象仍然会失败。
在我的问题中,我大大简化了代码,在这样做时我将reserved
属性更改为已processed
。 我的实际模型看起来更像是这样的:
class Stuff(db.Model):
id = db.Column(db.Integer, primary_key=True)
reserved = db.Column(db.Boolean)
事实证明, 保留是芹菜中的一个功能,这就是为什么属性无法从我的芹菜任务更新。 解决方案是重命名模型上的reserved
属性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.