为什么即使路由器不允许迁移,也会创建 django_migrations table?
Why django_migrations table is created even though router does not allow 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
我收到所有列为正常的迁移并且 django_migrations
table 存在于 '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', ]
是的,这是故意的,因为 documented
makemigrations always creates migrations for model changes, but if
allow_migrate() returns False, any migration operations for the
model_name will be silently skipped
所以这意味着只有 migration operations 会被跳过
我有 '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
我收到所有列为正常的迁移并且 django_migrations
table 存在于 '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', ]
是的,这是故意的,因为 documented
makemigrations always creates migrations for model changes, but if allow_migrate() returns False, any migration operations for the model_name will be silently skipped
所以这意味着只有 migration operations 会被跳过