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 迁移:可交换依赖项