Boroda aka Hamster (fantaseour) wrote,
Boroda aka Hamster
fantaseour

Category:

Symfony & SQL Migrations

Если Вы не знаете, что такое миграции (migrations), посмотрите вот этот ролик (да-да это из тех ruby envy commercials).

Думаю, что любой разработчик веб-приложений проходил через довольно неприятный процесс синхронизации структуры БД на девелоперской машине и на продакшен. Что до меня, так я очень долго не принимал мер против такого безобразия и апдейтил руками новые колонки, таблицы или данные.

Если код может быть под svn, где можно выкатывать любую точку разработки и где хранится вся история изменений, то база данных таких возможностей не дает. Однако для организации самой примитивной схемы миграций ничего особенного не нужно — достаточно сделать папку для нумерованных sql-дампов, где писать изменения текущей итерации. Нумеровать подряд, не связываясь нумерацией ревизий svn. В базе иметь служебную табличку с одним полем — текущей миграции. При обновлении смотреть текущую миграцию, и заливать подряд необходимые дампы. Зато теперь история изменений нашей БД лежит в репозитории, что удобно — вытащил коллега новый апдейт, прокатил миграции и имеет актуальную рабочую копию.

Конечно было бы правильным, если бы в Symfony были родные инструменты для миграций. Однако их нет, зато есть небольшой костыль от коммунити, который позволяет жить с миграциями удобнее, чем просто складывать дампы.

Описание инструмента можно посмотреть здесь. Суть механизма в том, что для каждой миграции вместо дампа делается класс вида

class Migration001 extends sfMigration {
  
public function up() 
  {
    
$this->executeSQL('ALTER TABLE `question` ADD `user_id` INT NOT NULL AFTER `id`');
  }

  
public function down() 
  {
    
$this->executeSQL('ALTER TABLE `question` DROP `user_id`');
  }
}

Далее пакетный файл читает из служебной таблицы в базе номер текущей миграции и прокатывает нужное количество классов как до последней миграции, так и для любого заданного номера. Как вперед, так и назад.

Классы используют Propel только в виде коннекта к базе, так, что переделать под Доктрину да и просто отторвать этот инструмент от Симфони должно быть несложно.

Неудобно то, что файлы залиты приложением в трак-вики и вместо скачать предлагают посмотреть исходник. Приходится копипастить в текстовый редактор и вычищать номера строк. Я там нашел небольшой баг — при первом запуске при создании заготовки для миграции программа кидается исключениями пытаясь вычислить максимальный номер миграции на основе файлов, которых пока нет. Пофиксил. Запаковал. Выложил

Tags: development
Subscribe

  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 17 comments