【问题标题】:South - migrating django application from sqlite to mysqlSouth - 将 django 应用程序从 sqlite 迁移到 mysql
【发布时间】:2012-03-03 07:35:33
【问题描述】:

我有一个 django 应用程序,直到现在我使用 sqLite 作为数据库后端。现在,当它非常接近生产时,我想将其全部转移到将在盒子上使用的 mySQL。

我将我的设置重新配置为 mysql 数据库并运行

manage.py syncdb --migrate

它开始创建表,但在第一次(共 40 个)迁移中都失败了,出现了一个旧错误(can't insert blob without key length 等等)。

我最初想到手动修复迁移文件,但很快意识到手动工作太多。

所以我想我会运行 manage.py migrate core 0040 (最后一次迁移,这会成功),但它仍然会尝试运行最初的迁移:

File "D:\~Sasha\Portman\core\migrations\0001_initial.py", line 23, in forwards
  ('name', self.gf('django.db.models.fields.TextField')(unique=True)),
... error message

有没有办法以某种方式迁移我的模型,而无需手动修复初始迁移文件和所有其他魔法?

【问题讨论】:

    标签: mysql django database-migration django-south


    【解决方案1】:

    首先,您无法选择要运行的迁移。 migrate core 0040 表示运行所有迁移 0040。换句话说,它不会运行 0041,但它运行 0001-0040。

    现在,它稍微回避了您的问题,但如果您尚未将此项目移至生产环境,那么您实际上并不需要所有这些迁移。假设它们都是架构迁移,您可以通过以下方式回滚到零:

    python manage.py migrate core zero
    

    然后,将它们全部删除(包括 0001_initial.py)并再次运行:

    python manage.py schemamigration --initial core
    

    重新生成初始迁移。它将基于模型的当前状态,无需进行 40 次迁移。

    在将新代码迁移到生产环境之前,像这样压缩迁移总是一个好主意。由于这是第一次发布,您可以将它们全部删除并从头开始,但在未来的迭代中,如果您在开发过程中生成 5 个迁移,在您提交之前,回滚到其中的第一个之前,然后删除这 5 个和然后生成一个新的架构迁移。结果只是一个迁移,其中包含这 5 个的所有更改。然后,您可以提交它并在生产中迁移。

    这里可能不能完全解决你的问题,但肯定会让调试更简单。

    【讨论】:

      【解决方案2】:

      在 mysql 后端部署项目时,我偶尔会遇到迁移问题。

      由于您正在部署一个新副本,因此您确实有几个选项可以避免运行所有强大功能的需要:

      首先,如果您想按原样维护您的迁移历史记录,您可以强制 syncdb 创建所有表而不考虑迁移,然后运行假迁移以使您的新数据库保持最新。看起来像:

      python manage.py syncdb --all
      python manage.py migrate --fake
      

      或者,如果您不关心历史迁移,则可以清除旧迁移(只需删除它们),然后创建新的初始迁移,例如:

      python manage.py schemamigration --initial core
      

      请确保您还清除了开发数据库中的 south_migrationhistory 表,以便开发和生产之间的所有内容保持同步

      【讨论】:

        猜你喜欢
        • 2013-06-23
        • 2023-03-12
        • 1970-01-01
        • 2012-04-26
        • 1970-01-01
        • 1970-01-01
        • 2011-11-05
        • 2011-03-11
        • 1970-01-01
        相关资源
        最近更新 更多