是否可以设置与 Django Celery 一起使用的不同数据库?
我有一个配置多个数据库的项目,不希望 Django Celery 使用默认数据库。
如果我仍然可以使用 django celery 管理页面并读取存储在这个不同数据库中的结果,我会很好:)
是否可以设置与 Django Celery 一起使用的不同数据库?
我有一个配置多个数据库的项目,不希望 Django Celery 使用默认数据库。
如果我仍然可以使用 django celery 管理页面并读取存储在这个不同数据库中的结果,我会很好:)
是的你可以。
第一个:您可以设置两个数据库并为 celery 任务明确指定第二个数据库(例如obj.save(using='second')
)
或创建第二个settings.py
将用于芹菜:
./manage.py celeryd --settings_second
应该可以使用 Django 数据库路由器为 django-celery 模型设置一个单独的数据库:
https://docs.djangoproject.com/en/1.4/topics/db/multi-db/#automatic-database-routing
我没有专门用 django-celery 对此进行测试,但如果由于某种原因它不起作用,那么它是 django-celery(或 Django 本身)中的一个错误,应该修复。
你的路由器看起来像这样:
class CeleryRouter(object):
"Route Celery models to separate DB."
APPS = (
'django', # Models from kombu.transport.django, if you're using Django as a message transport.
'djcelery',
)
DB_ALIAS = 'celery'
def db_for_read(self, model, **hints):
if model._meta.app_label in self.APPS:
return self.DB_ALIAS
return None
def db_for_write(self, model, **hints):
if model._meta.app_label in self.APPS:
return self.DB_ALIAS
return None
def allow_relation(self, obj1, obj2, **hints):
if (obj1._meta.app_label in self.APPS and
obj2._meta.app_label in self.APPS):
return True
return None
def allow_syncdb(self, db, model):
if db == self.DB_ALIAS:
# Only put models from APPS into Celery table (and south for
# migrations).
return model._meta.app_label in self.APPS + ('south',)
elif model._meta.app_label in self.APPS:
# Don't put Celery models anywhere else.
return False
return None
然后将其添加到您的设置中:
DATABASE_ROUTERS = ['path.to.CeleryRouter']