В предыдущем посте я рассказывал о модулях миграций для Коханы 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
================================================================================
Как мне кажется, тут нет ничего сложного, зато появляется удовольствие работая в команде с базой данных.
Из ближайших планов на будущее:
— Переписать модуль консоли
— Сделать нормальное и удобное форматирование вывода
— Реализовать «Таски» т.е. контроллеры но только для использования в консоли
— Багфиксы и прочее
— Придумать название модулю для миграций :)
Буду рад любой реакции, критике, патчам