Django迁移到多个数据库

时间:2018-04-09 21:30:49

标签: django database-migration

我在django项目中使用了两个数据库。要处理我有一个路由器文件:

class SecondDB:
    """
    A router to control all database operations on models in the
    auth application.
    """
    def db_for_read(self, model, **hints):
        if model._meta.app_label == 'app_in_second_db':
            return 'second_db'
        else:
            return 'default'

    def db_for_write(self, model, **hints):

        if model._meta.app_label == 'app_in_second_db':
            return 'app_in_second_db'
        else:
            return 'default'

    def allow_relation(self, obj1, obj2, **hints):
        if obj1._meta.app_label == 'app_in_second_db' or \
           obj2._meta.app_label == 'auditlog':
            return True
        else:
            return False

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

问题是如果我运行

$./manage.py migrate --database second_db

项目中的所有应用程序都迁移到第二个数据库。 我可以迁移特定的应用

./manage.py migrate app_in_second_db 0001_initial --database second_db

但是想知道我的路由器文件中是否存在错误,以及如何防止意外将所有模型移动到second_db数据库。

谢谢

1 个答案:

答案 0 :(得分:1)

来自官方文档:

  

makemigrations 始终会为模型更改创建迁移,但如果 allow_migrate()返回 False ,则会执行任何迁移操作   在db ...

上运行迁移时,将以静默方式跳过 model_name
def allow_migrate(self, db, app_label, model_name=None, **hints):
    if app_label == 'app_in_second_db':
        return db == 'second_db'

    # this will prevent other apps to create their tables in 'second_db'
    if db == 'second_db':
        return False

    return None