为什么即使路由器不允许迁移也会创建 django_migrations 表?

时间:2021-02-10 14:01:45

标签: django django-migrations

我有 'default''secondary' 数据库。为什么,即使有说明:

makemigrations always creates migrations for model changes, but if allow_migrate() returns False, any migration operations for the model_name will be silently skipped when running migrate on the db. Changing the behavior of allow_migrate() for models that already have migrations may result in broken foreign keys, extra tables, or missing tables. When makemigrations verifies the migration history, it skips databases where no app is allowed to migrate.

在运行 ./manage.py migrate --database=secondary 时,我收到所有列为 OK 和 django_migrations 表存在于 'secondary' 数据库中的迁移,而不是没有迁移,也没有跟踪它们。是 Django 设计决定还是我搞砸了路由?

class PrimaryRouter:
    """Primary router allowing ORM operations only on default database"""

    # NOTE: https://docs.djangoproject.com/en/3.1/topics/db/multi-db/#an-example
    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):
        """
        Relations between objects are allowed if both objects are
        in the primary/replica pool.
        """
        db_set = {'default'}
        if obj1._state.db in db_set and obj2._state.db in db_set:
            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 db == 'default'


# settings
DATABASE_ROUTERS = ['app.routers.PrimaryRouter', ]

1 个答案:

答案 0 :(得分:1)

是的,这是故意为 documented

<块引用>

makemigrations 总是为模型更改创建迁移,但如果 allow_migrate() 返回 False,任何迁移操作 model_name 将被静默跳过

所以这意味着只有 migration operations 会被跳过