2016-11-22 58 views
0

我正在使用Django 1.9.7和MySQL。Django迁移部分完成

我有一个包含多个操作的迁移文件。

migrations.RemoveField(
     model_name='team', 
     name='country', 
    ), 
    migrations.AddField(
     model_name='team', 
     name='description', 
     field=models.CharField(blank=True, max_length=200, null=True), 
    ), 
    migrations.AlterField(
     model_name='team', 
     name='iso_country', 
     field=models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='sys_models.Country', verbose_name='Country'), 
    ), 

现在我的印象是,如果这些语句中的一个失败,整个迁移将回滚作为一个更大的交易的一部分。那是对的吗?

我没有看到这种行为,相反,我发现某些DDL语句在迁移期间可能会成功,而另一个失败。另外,我认为订单将自上而下应用,这是否正确?我不一定在Django迁移中看到这种行为。

回答

1

Django将在SQLite和PostgreSQL的事务中运行迁移,因为这些数据库支持DDL事务。但是,MySQL does not support DDL transactions

我认为这些操作是按顺序运行的,所以我很惊讶你看到了不同的行为,但我对代码不够熟悉,无法给出明确的答案。

+1

这就是我所关心的。感谢您的确认。我在最后半小时制定了一个计划,我认为订单问题仅适用于第一个操作是RunPython操作(数据迁移)的迁移,该操作未指定为原子操作。所以即使失败了,迁移中的DDL语句也会被部分处理。 – samazi