В предыдущем посте я рассказывал о модулях миграций для Коханы 3. К сожалению ни один из модулей мне не понравился или по каким-то причинам не подошёл.

Сейчас же, я хочу представить свой форк модуля для миграций. Он основан на kohana-3-migrations. И получился сам по себе лёгкий и лишённый нескольких детских болезней своего родителя.

Итак, встречайте :) (он пока без нового названия и в экспериментальной ветке)

Вкратце, что он умеет:

  • Миграция сохраняется в виде обычной SQL-инструкции.
  • Инструкции UP и DOWN записываются в одном файле
  • В том же файле указывается описание миграции
  • Можно просмотреть список всех миграций
  • Накатывание и откат миграций теперь происходит ровно на один шаг
  • Появилось ключевое слово all для метода UP

Установка

Для нормальной работы модуля, нам потребуется ещё один модуль для командной строки, поэтому не забываем поставить и его тоже.

Скачиваем себе требуемые модули

cd /www/<your-project>
git submodule add git://github.com/ukko/kohana-3-console.git modules/console
git submodule add git://github.com/ukko/kohana-3-migrations.git modules/migrations
git submodule update --init 

Пожалуйста, переключитесь на ветку experimental

cd /www/<your-project>/modules/migrations
git checkout -b experimental origin/experimental

Не забываем подключить их в bootstrap.php

'console'        => MODPATH . 'console',
'migrations'     => MODPATH . 'migrations',

Теперь нам нужно скопировать консольный скрипт, сейчас существует слабое подобие того, что я бы хотел видеть, и оно работает только под unix (linux, macos, bsd)

cd /www/<your-project>
cp modules/console/cli ./

И создать доступный для записи каталог для сохранения информации о миграциях

mkdir application/migrations
chmod 777 application/migrations

Использование

SQL файл с миграцией состоит из трёх разделов:

  • Описание миграции
  • Код для метода UP
  • Код для метода DOWN

Все эти подразделы разделяются SQL комментариями. Описание — это комментарий в самом начале файла, код который идёт после комментария <strong>--UP</strong> — выполнится методом UP, а код который идёт после комментария <strong>--DOWN</strong> — выполнится в методе DOWN.

Вот пример SQL файла миграции

-- Table `credit` add field `accepted`

-- UP
ALTER TABLE `providers`
    ADD COLUMN `credit` DECIMAL(20, 2) UNSIGNED NOT NULL DEFAULT 0 AFTER `accepted`;

-- DOWN
ALTER TABLE `providers` DROP COLUMN `credit`;

Пожалуйста, не забывайте ставить точку с запятой, после каждой SQL инструкции!

Командная строка

Теперь, зная как выглядят файлы мы можем, вывести список всех файлов:

./cli migrations/status
============================ [ Kohana Migrations ] =============================

1    Initial struct DB
2    Fixtures
3*    Table `price` add field `spec`
4    Table `credit` add field `accepted`
5    Table `providers` add fields `payment` и `garant`
6    Table `good_price` add field `availability`
7    Table `provider_store` add field `image`

================================================================================
    Current:        3
    Latest:            7
================================================================================

Или же можно просмотреть краткое состояние миграций

./cli migrations/
============================ [ Kohana Migrations ] =============================
    Current:        3
    Latest:            7
================================================================================

Если нам нужно поднять на одну миграцию вверх, то мы пишем

./cli migrations/up
============================ [ Kohana Migrations ] =============================
    Requested Migration:    4
    Migrating:        UP
--------------------------------------------------------------------------------
Migrated: 004.sql Table `credit` add field `accepted`
================================================================================
    Current:        4
    Latest:            7
================================================================================

Если на несколько, то указываем номер миграции до которой нужно обновиться

./cli migrations/up/6
============================ [ Kohana Migrations ] =============================
    Requested Migration:    6
    Migrating:        UP
--------------------------------------------------------------------------------
Migrated: 005.sql Table `providers` add fields `payment` и `garant`
Migrated: 006.sql Table `good_price` add field `availability`
================================================================================
    Current:        6
    Latest:            7
================================================================================

Если нужно обновиться до последней, то можно указать ключевое слово «all»

./cli migrations/up/all
============================ [ Kohana Migrations ] =============================
    Requested Migration:    7
    Migrating:        UP
--------------------------------------------------------------------------------
Migrated: 001.sql Initial struct DB
Migrated: 002.sql Fixtures
Migrated: 003.sql Table `price` add field `spec`
Migrated: 004.sql Table `credit` add field `accepted`
Migrated: 005.sql Table `providers` add fields `payment` и `garant`
Migrated: 006.sql Table `good_price` add field `availability`
Migrated: 007.sql Table `provider_store` add field `image`
================================================================================
    Current:        7
    Latest:            7
================================================================================

Если нужно понизить (т.е. вернуть на предыдущее положение базу), то пишем down

./cli migrations/down
============================ [ Kohana Migrations ] =============================
    Requested Migration:    6
    Migrating:        DOWN
--------------------------------------------------------------------------------
Migrated: 007.sql Table `provider_store` add field `image`
================================================================================
    Current:        6
    Latest:            7
================================================================================

Если нужно вообще откатиться до нуля, то так и откатываемся

./cli migrations/down/0
============================ [ Kohana Migrations ] =============================
    Requested Migration:    0
    Migrating:        DOWN
--------------------------------------------------------------------------------
Migrated: 006.sql Table `good_price` add field `availability`
Migrated: 005.sql Table `providers` add fields `payment` и `garant`
Migrated: 004.sql Table `credit` add field `accepted`
Migrated: 003.sql Table `price` add field `spec`
Migrated: 002.sql Fixtures
Migrated: 001.sql Initial struct DB
================================================================================
    Current:        0
    Latest:            7
================================================================================

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

Из ближайших планов на будущее:
— Переписать модуль консоли
— Сделать нормальное и удобное форматирование вывода
— Реализовать «Таски» т.е. контроллеры но только для использования в консоли
— Багфиксы и прочее
— Придумать название модулю для миграций :)

Буду рад любой реакции, критике, патчам