Мы больше изучили Doctrine Migrations и получили некоторое представление о его внутренней работе (а также обновили ошибки, связанные с OP).
Основная проблема заключается в том, что в доктрине принципиально иной подход к миграции. Он создает абстрактную модель из вашей схемы БД, а затем позволяет вам изменить эту модель. Эти изменения не влияют на базовую БД, но Doctrine использует их, чтобы вывести фактические изменения, которые необходимо внести в БД.
Это похоже на diff для баз данных. Это имеет некоторые очень неприятные последствия. Например, если вы переименуете столбец в БД, операция с моделью будет выглядеть так:
public function renameColumn($oldColumnName, $newColumnName)
{
$column = $this->getColumn($oldColumnName);
$this->dropColumn($oldColumnName);
$column->_setName($newColumnName);
return $this;
}
Если вы используете эту функцию, а затем Doctrine примените миграцию, она затем изучит различия между старой и новой схемами (отсутствующие столбцы, добавленные столбцы и их типы) и определит, нужно ли переименовывать существующий столбец или отбросьте старый и создайте новый. Это означает, что Doctrine считает, что переименование столбца - это то же самое, что и его удаление и повторное создание, и поэтому очень глупо.
- Если вы переименуете один столбец и больше ничего не измените, он выдаст команду «переименовать» в СУБД.
- Если вы переименуете столбец и измените его тип (скажем, varchar (80) на varchar (100)), он отбросит его и создаст заново.
- Если вы переименуете 2 столбца и ничего не измените, он будет паниковать, отбрасывать их обоих и воссоздавать их (алгоритм diff такой элементарный)
Я думаю, что это плохой подход к миграции БД, потому что он не работает надежно. Весь смысл такого инструмента - хранить данные в процессе миграции, и это не соответствует этому основному требованию.
Это говорит о том, что мы все равно используем это, потому что просто нет ничего лучше. Мы добавили преднамеренные сообщения об ошибках в ненадежных операциях, чтобы избежать попадания разработчиков во многие ловушки.