django - 以编程方式检查是否需要部署django南迁移

标签 django data-migration django-south

我的部署策略如下所示(使用Fabric):

  • 创建一个新的virtualenv
  • 在新的virtualenv中部署新代码
  • 显示维护页面
  • 将当前数据库复制到新数据库
  • 迁移新数据库
  • 将新代码指向新的数据库
  • 将当前virtualenv链接到新的venv
  • 重新启动服务
  • 删除维护页面

  • 我想快速迭代。现在,大多数代码更改都不包含迁移。而且,数据库正在增长,因此每次部署(大多是很小的)更改时,复制数据库都会产生大量开销。为了避免复制数据库,我想检查是否存在需要部署的迁移(步骤4之前)。如果没有迁移,我可以直接从步骤2转到步骤7。如果有迁移,我将按照所有步骤进行操作。为此,我需要以编程方式检查是否需要部署迁移。我怎样才能做到这一点?

    最佳答案

    在部署新代码的第2步中,您可以部署脚本,该脚本在服务器上运行时将检测是否有新的迁移。

    示例代码如下:

    # copied mostly from south.management.commands.migrate
    from south import migration
    from south.models import MigrationHistory
    
    apps  = list(migration.all_migrations())
    
    applied_migrations = MigrationHistory.objects.filter(app_name__in=[app.app_label() for app in apps])
    applied_migrations = ['%s.%s' % (mi.app_name,mi.migration) for mi in applied_migrations]
    
    num_new_migrations = 0
    for app in apps:
        for migration in app:
            if migration.app_label() + "." + migration.name() not in applied_migrations:
                num_new_migrations = num_new_migrations + 1
    
    return num_new_migrations
    

    如果将以上代码包装在脚本中,则架构部署脚本可以使用运行操作来获取新迁移的数量。

    如果返回零,则可以跳过与复制数据库相关的步骤。

    关于django - 以编程方式检查是否需要部署django南迁移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7089969/

    相关文章:

    Django:如何强制翻译成模板内的给定语言?

    grails db-generate-changelog 错误

    Android应用程序无数据库升级

    django - 通过向南迁移将数据库更新到heroku时出现问题

    python - Django 防止远程数据库迁移

    python - 如何从 HTML 表单获取密码到我在 Django 中的 View

    python - 数据迁移导致错误AttributeError : type object 'User' has no attribute 'normalize_username' ?

    python - -bash : ./manage.py:权限被拒绝

    mysql - Django 南 : Combining "alter table"s for better performance?

    python - 如何在 django 中美化 rss feed?