当有多个涉及多个线程的芹菜工作线程都查询同一个数据库时,我正在努力使我的 Flask、SQLAlchemy (mysql( 和 Celery 设置正常工作。
问题是我无法弄清楚如何以及在何处应用所需的更改,这些更改为烧瓶应用程序和每个芹菜工人提供了一个独立的数据库对象。
据我了解,需要单独的会话来避免令人讨厌的数据库错误,例如阻止其他数据库查询的不完整事务。
这是我当前的项目结构
/flask_celery.py
from celery import Celery
def make_celery(app):
celery = Celery(app.import_name, backend=app.config['CELERY_RESULT_BACKEND'],
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.py
#!/usr/bin/env python
import config
from app import app
app.run(port=82,debug=True, host='0.0.0.0')
#app.run(debug=True)
应用/__init.py__
from flask import Flask
from celery import Celery
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
from flask_celery import make_celery
app = Flask(__name__)
app.config.from_object('config')
app.secret_key = app.config['SECRET_SESSION_KEY']
db = SQLAlchemy(app)
migrate = Migrate(app, db)
celery = make_celery(app)
也许给SQLALCHEMY_BINDS
一个机会。这是有关如何绑定多个数据库的指南。
恐怕你还有多余的动作应该做。
- 我假设您必须
config.py
来保存应用程序配置。使用您准备的值Config
类中添加SQLALCHEMY_BINDS
,这可能是其他几个数据库的 URI。 - 处理
models.py
中的模型类(如果文件存在(。 - 以某种方式管理您的
bind_key
作为参数(对不起,我没有详细说明(。 - 处理
bind_key
正确的芹菜工作的争论......
我希望这可能会对您有所帮助。如果您解决了这个问题,请告诉我,以便我可以为有类似案例的人编辑此答案。