South - 将 django 应用程序从 sqlite 迁移到 mysql

Posted

技术标签:

【中文标题】South - 将 django 应用程序从 sqlite 迁移到 mysql【英文标题】:South - migrating django application from sqlite to 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

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

【问题讨论】:

【参考方案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 表,以便开发和生产之间的所有内容保持同步

【讨论】:

以上是关于South - 将 django 应用程序从 sqlite 迁移到 mysql的主要内容,如果未能解决你的问题,请参考以下文章

从 South 迁移到 Django 1.7 迁移:可交换依赖项

将 Django South 与多个代码分支一起使用的工作流程

将 South 添加到 Django 项目、开发和生产中

Django South - 表已经存在

不小心删除了我的 django south 迁移目录

无法在 Django 1.7 中创建 South 数据库模型