Как использовать сельдерей с несколькими базами данных? - PullRequest
0 голосов
/ 28 мая 2018

Я перемещаю свой проект django из одной базы данных в две разные базы данных mysql (конфигурация master-slave), где все мои чтения идут на slave, а записи идут на master.

У меня есть следующиеконфигурации в моем файле settings.py

DATABASES = {
'default': {},
'master': {
    'ENGINE': 'django.db.backends.mysql',
    'NAME': config('django.db.dbName'),
    'USER': config('django.db.dbUser'),
    'PASSWORD': config('django.db.dbPass'),
    'HOST': config('django.db.dbhost_master'),
},
'slave': {
    'ENGINE': 'django.db.backends.mysql',
    'NAME': config('django.db.dbUser'),
    'USER': config('credential_id'),
    'PASSWORD': config('dbPass'),
    'HOST': config('django.db.dbhost_slave'),
},
}

DATABASE_ROUTERS = ["db_router.DBRouter"]

И вот так выглядит мой DBRouter:

class DBRouter(object):
def db_for_read(self, model, **hints):
    """
    Reads always go to the slave.
    """
    return 'slave'

def db_for_write(self, model, **hints):
    """
    Writes always go to the master.
    """
    return 'master'

def allow_relation(self, obj1, obj2, **hints):
    """
    Relations between objects are allowed if both objects are
    in the master/replica nodes.
    """
    db_list = ('master', 'slave')
    if obj1._state.db in db_list and obj2._state.db in db_list:
        return True

    return None

def allow_migrate(self, db, app_label, model_name=None, **hints):
    """
    All non-auth models end up in this pool.
    """
    return True

Я столкнулся с некоторыми проблемами при запуске миграции, но все работает нормально, когда я предоставляю - база данных = мастер явно с каждой командой:

Например.venv / bin / python app / manage.py migrate --database = master --no-input;

Но я не могу запустить celerybeat с этой конфигурацией.

python manage.py celerybeat --settings="com_executor.settings" --logfile=~/celery_beat.log

даетошибка: неправильно настроен: settings.DATABASES настроен неправильно.Пожалуйста, укажите значение ДВИГАТЕЛЯ.Обратитесь к документации по настройкам для получения более подробной информации.

Это та же ошибка, которая появляется при переносе, но исчезает, когда я добавляю --database = master.

Но то же самое не работает в случаеof celerybeat:

python manage.py celerybeat --database=master --settings="com_executor.settings" --logfile=~/celery_beat.log

Выдает ошибку ниже

manage.py celerybeat: error: unrecognized arguments: --database=master

Кто-нибудь нашел способ справиться с таким сценарием, или добавление конфигурации "по умолчанию" для базы данных - единственный способ получитьэто работает?(которого я стараюсь избегать, насколько это возможно, чтобы не отправлять неожиданные команды не тому экземпляру БД)

...