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