如何使用芹菜与多个数据库?

时间:2018-05-28 07:25:41

标签: django celery django-celery django-database celerybeat

我正在将我的django项目从单个数据库移动到使用2个不同的mysql数据库(主从配置),其中我的所有读取都转到从属,然后写入主服务器。

我在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

我遇到了一些运行迁移的问题,但是当我使用每个命令显式提供 - database = master 时,一切正常:

EG。 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配置不正确。请提供ENGINE值。检查设置文档以获取更多详细信息。

这是同样的错误,我在迁移时得到但是一旦我添加了--database = master就消失了。

但是对于celerybeat来说同样不起作用:

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

给出以下错误

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

有没有人找到任何方法来处理这种情况,或者为数据库添加“默认”配置是让它运行的唯一方法? (我想尽可能避免,以确保我没有向错误的数据库实例发送意外命令)

0 个答案:

没有答案