簡體   English   中英

使用Flask和SQLAlchemy在Celery任務中未更新數據庫

[英]Database is not updated in Celery task with Flask and SQLAlchemy

我正在用Flask和SQLAlchemy編寫Web應用程序。 我的程序需要在后台處理一些東西,然后將此東西標記為在數據庫中已處理。 使用標准的Flask / 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):
    # process stuff here

    stuff.processed = True
    db.session.commit()

@app.route("/process_stuff/<id>")
def do_process_stuff(id):
    stuff = Stuff.query.get_or_404(id)
    process_stuff.delay(stuff)
    return redirect(url_for("now_wait"))

我可以從process_stuff訪問我的數據庫(例如,提交諸如Stuff.query.get(some_id)工作之類的查詢),但是db.session.commit()無濟於事:我的stuff記錄未更新。 根據Celery worker日志,提交已發生,但數據庫中沒有任何更改。 我的db.session.commit()嗎? 是否可以以某種方式做出這樣的提交?

知道了 傳遞給process_stuff() stuff未附加到db.session 我必須在process_stuff()進行顯式請求,以獲得正確的stuff對象,如下所示:

@celery.task()
def process_stuff(stuff):
    # process stuff here

    my_stuff = Stuff.query.get(stuff.id)

    my_stuff.processed = True
    db.session.commit()

現在可以了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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