【问题标题】:Automatic db router for migrations in django用于在 django 中迁移的自动数据库路由器
【发布时间】:2017-01-01 04:39:19
【问题描述】:

我正在构建一个由 Django 驱动的站点,我想为一些应用程序建立单独的数据库,我构建了一个灵活的路由器,将每个应用程序路由到预定义的数据库,这很好用。 问题是,当我迁移我的模型时,我每次都必须设置--database 参数,我发现这很烦人且多余。还有很多次,我用迁移的应用程序中的表淹没了我的默认数据库(忘记添加--database)。 我在路由器中尝试了allow_migrate(...) 功能,但我所能实现的只是安全机制,如果我忘记指定数据库,它将不会运行迁移。 我的问题是:有没有办法为 Django 中的模型迁移设置自动数据库选择? 我的方法可能是错误的,令我惊讶的是,以前似乎没有人这样做过。

【问题讨论】:

    标签: python django django-migrations


    【解决方案1】:

    对于遇到我遇到的问题的任何人,这是我最终解决的问题:

    routers.py:

    from django.conf import settings
    class DatabaseAppsRouter(object):
    
        def db_for_read(self, model, **hints):
            #  your db routing
    
        def db_for_write(self, model, **hints):
            #  your db routing
    
        def allow_relation(self, obj1, obj2, **hints):
            #  your db routing
    
        def allow_syncdb(self, db, model):
            #  your db routing
    
        def allow_migrate(self, db, app_label, model_name=None, **hints):
            if db in settings.DATABASE_APPS_MAPPING.values():
                return settings.DATABASE_APPS_MAPPING.get(app_label) == db
            elif app_label in settings.DATABASE_APPS_MAPPING:
                return False
    

    settings.py

    DATABASE_ROUTERS = ['project.routers.DatabaseAppsRouter']
    DATABASE_APPS_MAPPING = {'contenttypes': 'default',
                         'auth': 'default',
                         'admin': 'default',
                         'sessions': 'default',
                         'messages': 'default',
                         'staticfiles': 'default',
                         'myapp': 'mydb',
                         }
    

    这个设置让我可以运行两个命令:

    python manage.py migrate
    python manage.py migrate --database=mydb
    

    这仍然是一对多,但至少现在我不能错误地将 myapp 迁移到默认数据库,我想承认这种情况发生的次数更多。


    警告 - 咆哮:

    到目前为止,我发现 Django 的设计很古怪,但非常合乎逻辑且对程序员友好,就像 python 本身一样。但是迁移与多个数据库设置交互的方式非常不方便,因此很容易用不需要的表淹没默认数据库。 凯文在他的回答中链接的讨论表明,我不是唯一一个遇到这种困难的人。

    【讨论】:

      【解决方案2】:

      我不知道有什么方法可以自动做到这一点。但是,一个简单的方法可能是使用适当的--database 和应用程序参数多次调用 Django migrate 命令的migrate 命令中的write your own version

      根据 Django 迁移的作者,这是a conscious design decision,所以我不希望它改变:“就像同步数据库一样,迁移一次只在一个数据库上运行,所以你必须为每个数据库单独执行它数据库,正如你所建议的那样。这是设计使然。"

      【讨论】:

      • 感谢有关此主题的讨论的链接,似乎 db/migrations 子系统的设计不允许我首选的解决方案。我会试试你的建议。
      猜你喜欢
      • 2019-10-08
      • 2015-09-25
      • 2017-08-19
      • 2021-09-14
      • 2021-05-01
      • 2011-04-14
      • 1970-01-01
      • 2012-03-28
      • 1970-01-01
      相关资源
      最近更新 更多