2016-11-22 2 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

Смежные вопросы