【问题标题】:Applying migrations to a really out of sync database将迁移应用到真正不同步的数据库
【发布时间】:2015-11-28 19:54:08
【问题描述】:

我继承了一个状态非常糟糕的数据库。基本上如下:

  • 大多数应用没有迁移文件夹或已过时
  • 南迁历史表与数据库不同步
  • 数据库表与 Django 中的当前模型不匹配(尽管我知道模型和表之间发生了什么变化)

我不担心保留过去的迁移历史或类似的东西,但我确实需要保留数据库中当前的数据。我正在寻找一种方法来将当前数据库状态声明为初始状态并从那里继续前进。如有必要,我可以修改模型,以便数据库表与当前模型匹配,因为我认为这是开始的必要条件。

我已经搞砸了几个小时,如果有任何建议可以解决这个问题,我将不胜感激。

补充说明:

  • 数据库正在使用 sqlite
  • 迁移到 Django 1.8 已经在讨论中,但还需要几个月的时间

【问题讨论】:

  • 如果迁移到 django 1.8 是可行的,那么现在是时候把它向前推进了。请放心,从南方迁移到 django 迁移会带来一些它自己的问题(尽管它不应该)。如果您现在不进行转换,您将打两场而不是一场
  • 将模型与当前数据库状态匹配,然后擦除/重新创建迁移应该可以解决问题。

标签: django database-migration django-south django-1.6


【解决方案1】:

django 1.6 with South 使用说明

我建议下载数据库的转储(或在架构中)并使用 sqllite 在本地计算机上创建一个新数据库。

然后删除所有应用中所有现有的/migrations 文件夹 然后删除数据库表south_migrations中的所有内容

现在禁用所有不在数据库中的“新”模型更改

然后再次进行初始迁移

./manage.py schemamigration myapp --initial

然后全部伪造,因为结构已经存在 ./manage.py migrate --fake

现在您的迁移已与您的生产数据库同步。

现在重新启用您的新模型更改,然后创建迁移每个应用 ./manage.py schemamigration myapp

然后迁移到新的变化 ./manage.py migrate

注意:在您的服务器和开发机器上,您需要确保在创建任何新迁移之前还删除“迁移”文件夹中的所有旧 .pyc 文件。

根据上面 e4c5 的 cmets,当您迁移到 django 1.7/1.8 时(因为 South 在 1.7 中集成到 Django),您将不得不再次执行其中一些步骤,因此您可能需要考虑升级到 1.7同时(虽然这不一定是微不足道的升级......)。

【讨论】:

  • 实体应该是为了简化我们的开发生活,而不是创造一系列全新的问题。对于您可能已经创建数据库但现在属于数据库管理员的大型企业,更新和维护是在未经您许可的情况下完成的。迁移现在变得毫无用处,有必要去 DB 1st。因此,我的数据库开发在两个独立的项目中。一个用于在创建项目时进行迁移,另一个用于数据库优先和应用程序使用。这样可以避免此类问题,然后我所做的就是在 DB 1st 项目中重新创建实体。但是,我的项目是 .Net
  • @Clarence Django 是建立在应用程序控制模式的假设之上的。 Schema 由 ORM 确定。 DBA 都假设应用程序必须遵循数据库模式。在 Django 中构建数据库,然后将控制权交给 DBA 将导致灾难。
  • @Neil 我明白你的意思,但是,我的评论是关于迁移的使用并在实体框架 .Net 环境中消除它们。因此,如果以某种方式与 Django 相似,我的 pov 会有所帮助。通过消除迁移将应用程序开发与数据库开发分开来为此做好准备一直是我在 .Net EF 环境中的关键。在现实世界中,如果您公司的 IT 结构将数据库操作移交给 DBA,那么尽管您担心它会成为“灾难的秘诀”,但您还是会将其交给 DBA,尤其是如果您没有将这些点连在一起为什么。
猜你喜欢
  • 1970-01-01
  • 2012-03-10
  • 2012-06-05
  • 2020-09-03
  • 2012-07-26
  • 2016-04-26
  • 1970-01-01
  • 1970-01-01
  • 2015-01-21
相关资源
最近更新 更多