Django芹菜和多个数据库(Celery,Django和RabbitMQ)

时间:2011-03-28 14:15:22

标签: django rabbitmq celery django-celery

是否可以设置与Django Celery一起使用的其他数据库?

我有一个配置有多个数据库的项目,不希望Django Celery使用默认的数据库。

如果我仍然可以使用django celery管理页面并读取存储在这个不同数据库中的结果,我会很高兴:)

2 个答案:

答案 0 :(得分:4)

是的,你可以。

首先:您可以设置两个数据库并明确指定第二个数据库用于芹菜任务(例如obj.save(using='second')

或创建将用于芹菜的第二个settings.py

./manage.py celeryd --settings_second

答案 1 :(得分:2)

应该可以使用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']