Django Celery и несколько баз данных (Celery, Django и RabbitMQ) - PullRequest
2 голосов
/ 28 марта 2011

Можно ли установить другую базу данных для использования с Django Celery?

У меня есть проект с несколькими базами данных в конфигурации, и я не хочу, чтобы Django Celery использовал проект по умолчанию.

Хорошо, если я все еще смогу использовать админские страницы django и читать результаты, хранящиеся в этой другой базе данных:)

Ответы [ 2 ]

4 голосов
/ 28 марта 2011

да, вы можете.

first: вы можете настроить две базы данных и явно указать вторую для задач сельдерея (например, obj.save(using='second'))

или создать вторую settings.py который будет использоваться для сельдерея:

./manage.py celeryd --settings_second
2 голосов
/ 27 мая 2012

Должна быть возможность создать отдельную базу данных для моделей django-celery с использованием маршрутизаторов базы данных Django:

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']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...