仅将Django应用程序迁移到备用数据库

时间:2019-03-21 13:58:01

标签: python django

我有一个包含多个应用程序的Django项目。我希望将其中一个应用程序(名为warehouse)转到特定的数据库(也称为warehouse),但是它似乎无法正常工作。当我从命令行(python manage.py migrate warehouse)迁移此应用程序时,收到一条成功消息:

>>> python manage.py migrate warehouse
Operations to perform:
  Apply all migrations: warehouse
Running migrations:
  Applying warehouse.0001_initial... OK

迁移出现在default数据库中,这是错误的,但是没有创建表,这是正确的。如果我将命令更改为以下内容:

>>> python manage.py migrate warehouse --database=warehouse

这些表正确显示在我的warehouse数据库中,迁移也一样。如何更改内容,以便第一个命令引发错误,或者至少指示给定的应用程序无法应用于默认数据库?

这是我的设置:

settings.py中的数据库设置

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'projects',
        'USER': 'myuser',
        'PASSWORD': 'mypassword',
        'HOST': 'localhost',
        'PORT': '5432',
    },
    'warehouse': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'projects-warehouse',
        'USER': 'otheruser',
        'PASSWORD': 'otherpassword',
        'HOST': 'localhost',
        'PORT': '5432',
    },
}

DATABASE_ROUTERS = ['warehouse.dbrouter.WarehouseRouter', 'base.dbrouter.BaseRouter']

dbrouter.py [仓库应用]

class WarehouseRouter:
    def db_for_read(self, model, **hints):
        if(model._meta.app_label == 'warehouse'):
            return 'warehouse'

        return None

    def db_for_write(self, model, **hints):
        if(model._meta.app_label == 'warehouse'):
            return 'warehouse'

        return None

    def allow_relation(self, obj1, obj2, **hints):
        if(obj1._meta.app_label == 'warehouse' and
           obj2._meta.app_label == 'warehouse'):
            return True

        return None

    def allow_migrate(self, db, app_label, model_name=None, **hints):
        if(app_label == 'warehouse'):
            return db == 'warehouse'

        return None

dbrouter.py [所有其他应用程序]

class BaseRouter:
    def db_for_read(self, model, **hints):
        return 'default'

    def db_for_write(self, model, **hints):
        return 'default'

    def allow_relation(self, obj1, obj2, **hints):
        if(obj1._state.db == "default" and obj2._state.db == "default"):
            return True

        return None

    def allow_migrate(self, db, app_label, model_name=None, **hints):
        return db == 'default'

1 个答案:

答案 0 :(得分:0)

您使用数据库来持久化模型,而Django也使用数据库来跟踪迁移,如果您在迁移应用程序时未指定任何数据库名称,则Django将使用"default"数据库来存储模型。迁移元数据。

这是预期的行为。当您这样做时:

>>> python manage.py migrate warehouse

Django将迁移保存到默认数据库中,并且由于warehouse而使表进入WarehouseRouter数据库。

,然后再执行以下操作:

>>> python manage.py migrate warehouse --database=warehouse

然后Django“知道”它必须将迁移放置在“默认”数据库的另一个位置。

我还没有进行测试,但是我认为即使没有WarehouseRouter,它也可以正常工作(迁移和创建表,不向模型写入数据和从模型读取数据)。