簡體   English   中英

使用Flask和Flask-SQLAlchemy的Celery無法更新數據庫記錄

[英]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(我在芹菜之外測試了這個,我可以更新屬性)。

這里有一個非常類似的問題但該解決方案對我的情況不起作用

庫版本

  • 燒瓶0.12.2
  • SQLAlchemy 1.1.11
  • 芹菜4.0.2
  • Flask-SQLAlchemy 2.2

更新

其他測試顯示我可以創建新的對象並將其持久保存到數據庫中 - 更新預先存在的對象仍然會失敗。

在我的問題中,我大大簡化了代碼,在這樣做時我將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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM