2012-02-10 48 views
3

我有一个django应用程序,直到现在我用sqLite作为数据库后端。现在,当它接近生产时,我想把它全部移到mySQL上,它将被用在盒子上。南 - 从sqlite到mysql的迁移django应用程序

我重新配置我的设置到MySQL数据库和运行

manage.py syncdb --migrate 

它开始创建表和所有,但在第一(满分40)的迁移失败,一个旧的错误(can't insert blob without key length和所有)。

我首先想到手动修复迁移文件,但很快意识到有太多的手动工作。

所以我想,好吧,我会跑manage.py迁移核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 

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

回答

5

首先,您不能选择要运行的迁移。 migrate core 0040意味着运行所有迁移高达 0040.换句话说,它不会运行0041,但它运行0001-0040。

现在,它稍微提出了一些问题,但如果您尚未将此项目移至生产环境,则实际上并不需要进行所有这些迁移。假设他们可以回滚到零所有schemamigrations:

python manage.py migrate core zero 

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

python manage.py schemamigration --initial core 

要重新生成初始迁移。它将基于您的模型的当前的状态,否定40个迁移的需要。

在将新代码移至生产之前,压缩这样的迁移总是一个好主意。由于这是第一次启动,因此您可以将它们全部删除并从头开始,但在将来的迭代中,如果在开发过程中,在提交之前生成5次迁移,请回滚到第一个之前,然后删除这5个和然后生成一个新的schemamigration。结果只是一个迁移,其中包含所有这些变化5.然后,您可以提交并在生产中迁移。

它可能无法在这里完全解决您的问题,但它肯定会使调试更简单。

+0

烨之间,即做到了:)谢谢! – abolotnov 2012-02-10 23:58:55

2

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

由于要部署一个新的副本,你有回避了需要运行所有mightations的一对夫妇的选择:

首先,如果你想保持你的移民历史,是,你可以强制syncdb创建所有表,无论迁移如何,然后运行伪迁移以使您的新数据库保持最新状态。这将是这样的:

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

或者,如果你不关心你的历史迁移,你可以清除旧迁移出去(只删除),然后创建一个新的初始迁移,如:

python manage.py schemamigration --initial core 

只要确保你也清楚了south_migrationhistory表中您的开发数据库,​​使一切保持同步开发和督促