如何解决为什么即使路由器不允许迁移也会创建 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,**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 总是为模型更改创建迁移,但如果 allow_migrate() 返回 False,任何迁移操作 model_name 将被静默跳过
所以这意味着只有 migration operations 会被跳过
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。