Модуль для простых миграций

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

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

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

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

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

Установка

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

Скачиваем себе требуемые модули
<pre lang="shell"> 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 </pre> <p>

Пожалуйста, переключитесь на ветку experimental
<pre lang="shell"> cd /www/<your-project>/modules/migrations git checkout -b experimental origin/experimental </pre> <p>

Не забываем подключить их в bootstrap.php
<pre lang="php"> 'console' => MODPATH . 'console', 'migrations' => MODPATH . 'migrations', </pre> <p>

Теперь нам нужно скопировать консольный скрипт, сейчас существует слабое подобие того, что я бы хотел видеть, и оно работает только под unix (linux, macos, bsd)
<pre lang="shell"> cd /www/<your-project> cp modules/console/cli ./ </pre> <p>

И создать доступный для записи каталог для сохранения информации о миграциях
<pre lang="shell"> mkdir application/migrations chmod 777 application/migrations </pre> <p>

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

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

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

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

Вот пример SQL файла миграции
` <pre lang="sql"> -- Tablecreditadd fieldaccepted`

– 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

================================================================================

``

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

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

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

Read more posts by this author.