【发布时间】:2021-02-10 14:01:45
【问题描述】:
我有 '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', ]
【问题讨论】: