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

  • (no subject)

    Я очень люблю конференции. Они зажигают в разработчике свечечку, которую он потом бережно несет в себе через весь год! Когда-то давно, я с завистью…

  • wordpress: php -> nodejs

    Хипстеры захватывают мир :) Не очень понятно, как этот переход отразится, на людях, которые ставят этот вордпресс на любой копеечный хостинг с…

  • ultimate php

    For those who asked how to get started testing PHP7. I have packaged up my dev environment in a Vagrant box: https://t.co/EOhyi17fPI— Rasmus…

  • 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

  • (no subject)

    Я очень люблю конференции. Они зажигают в разработчике свечечку, которую он потом бережно несет в себе через весь год! Когда-то давно, я с завистью…

  • wordpress: php -> nodejs

    Хипстеры захватывают мир :) Не очень понятно, как этот переход отразится, на людях, которые ставят этот вордпресс на любой копеечный хостинг с…

  • ultimate php

    For those who asked how to get started testing PHP7. I have packaged up my dev environment in a Vagrant box: https://t.co/EOhyi17fPI— Rasmus…