+7 (495) 229-0436   shopadmin@itshop.ru 119334, г. Москва, ул. Бардина, д. 4, корп. 3
 
 
Вход
 
 
Каталог
 
 
Подписка на новости
Новости ITShop
Windows 7 и Office: Новости и советы
Обучение и сертификация Microsoft
Вопросы и ответы по MSSQLServer
Delphi - проблемы и решения
Adobe Photoshop: алхимия дизайна
 
Ваш отзыв
Оцените качество магазина ITShop.ru на Яндекс.Маркете. Если вам нравится наш магазин - скажите об этом Google!
 
 
Способы оплаты
 
Курс расчета
 
 1 у.е. = 92.01 руб.
 
 Цены показывать:
 
 
 
 
  
Новости, статьи, акции
 

Миграция базы данных в Zend Framework: Akrabat_Db_Schema_Manager

03.08.2012 12:53
3axap4eHko

В процессе работы над одним огромным проектом на Zend Framework, возникла необходимость миграции баз данных и перемещение между версиями, т.е. кроме update, был необходим так называемый downdate. Немного погуглив натолкнулся на интересную статью Роба Алана (в дальнейшем Автор) "Akrabat_Db_Schema_Manager: Zend Framework database migrations". Данная статья не является переводом оригинала, а скорее синтезом его и возникшей проблемы. Об этом и пойдет разговор.

После каждого изменения в базе данных (добавление столбцов, таблиц, индексов, ключей и т.д.), нужно создавать отдельный файл миграции. Подобные файлы можно размещать в каталоге ./scripts/migrations. Автор предлагает именовать файл миграции как 001-CreateUsersTable.php. Номер определяет порядок, в котором данные файлы будут запускаться, т.е. по сути идет [порядковый номер]-[краткое описание миграции].php. Но в этом не так много информативности. По этому мы решили именовать миграцию как[номер-ревизии]-[краткое описание миграции].php. Для тех кто пользуется hg могут использовать порядковый номер changeset. В связи с этим пришлось немного переписать класс Akrabat_Db_Schema_Manager, т.к. в одну ревизию могло входить несколько миграций и имена файлов переопределялись. Метод _getMigrationFiles() возвращает не массив вида:

$files["v$versionNumber"] = array(
                        'path'=>$path,
                        'filename'=>$entry,
                        'version'=>$versionNumber,
                        'classname'=>$className);
А массив массивов:
$files["v$versionNumber"][] = array(
                        'path'=>$path,
                        'filename'=>$entry,
                        'version'=>$versionNumber,
                        'classname'=>$className);

Соответственно изменения коснулись и метода _processFile($migration, $direction), в который передавался параметр $migration не как массив, а массив массивов. Кому интересно, исходные коды классов выложу наGitHub, а пока расскажу про основной алгоритм модернизации.

Файл миграции содержит класс наследуемый от Akrabat_Db_Schema_AbstractChange и содержащий два метода: up() и down(). Метод up() запускает процесс обновления БД, а down() - в случае отката ревизии. Вот немного измененный пример, который приводит Автор:

class CreateUsersTable extends Akrabat_Db_Schema_AbstractChange 
{
    function up()
    {
$tableName = $this->_tablePrefix . 'users';
$sql = "CREATE TABLE IF NOT EXISTS $tableName (
                  id int(11) NOT NULL AUTO_INCREMENT,
                  username varchar(50) NOT NULL,
                  password varchar(75) NOT NULL,
                  roles varchar(200) NOT NULL DEFAULT 'user',
                  PRIMARY KEY (id)
                )";
        $this->_db->query($sql);
        $data = array();
        $data['username'] = 'admin';
        $data['password'] = sha1('password');
        $data['roles'] = 'user,admin';
        $this->_db->insert('users', $data);
    }

  function down()
    {
$tableName = $this->_tablePrefix . 'users';
        	$sql = "DROP TABLE IF EXISTS $tableName";
        	$this->_db->query($sql);
    }
}

В примере введена поддержка префикса таблиц, который указывается в конфигурационном файле, в ключе resources.db.table_prefix. Но опять есть 1 минус, имя класса совпадает с [кратким описанием миграции], и если у нас будет хотя бы 2 одинаковых описания, то вылетит Fatal error: Cannot redeclare class. Для этого определим индекс массива 'classname' как
'classname'  => $className.$versionNumber

и аналогично именуем класс - это позволит избежать нам ошибки. 
А теперь - самое вкусное. Прикручиваем всю эту красоту к zend Tool. Как установить Zend Tool я рассказывать не буду, об этом уже много писали. Для начала определимся где хранить Akrabat ZF Library, я предпочитаю все PHP библиотеки хранить в /usr/share/php/, это значит что путь к ней будет /usr/share/php/Akrabat. Далее все просто:
$ zf --setup storage-directory
$ zf --setup config-file
$ echo "`php -r 'echo get_include_path().PATH_SEPARATOR;'`/usr/share/php/Akrabat">~/.zf.ini
$ echo "basicloader.classes.0 = "Akrabat_Tool_DatabaseSchemaProvider"">>~/.zf.ini

Теперь убедимся что все работает:
$ zf ? database-schema

Должны увидеть что-то похожее:
Zend Framework Command Line Console Tool v1.11.11
Actions supported by provider "DatabaseSchema"
  DatabaseSchema
    zf update database-schema env[=development] dir[=./scripts/migrations]
    zf update-to database-schema version env[=development] dir[=./scripts/migrations]
    zf decrement database-schema versions[=1] env[=development] dir[=./scripts/migrations]
    zf increment database-schema versions[=1] env[=development] dir[=./scripts/migrations]
    zf current database-schema env[=development] dir[=./migrations]
    zf get-table-prefix database-schema

Источники

  1. Статья Автора
  2. Akrabat ZF Library на GitHub.com

Ссылки по теме

  
Помощь
Задать вопрос
 программы
 обучение
 экзамены
 компьютеры
Бесплатный звонок
ICQ-консультанты
Skype-консультанты

Общая справка
Как оформить заказ
Тарифы доставки
Способы оплаты
Прайс-лист
Карта сайта
 
Бестселлеры
Курсы обучения "Atlassian JIRA - система управления проектами и задачами на предприятии"
Microsoft Windows 10 Профессиональная 32-bit/64-bit. Все языки. Электронный ключ
Microsoft Office для Дома и Учебы 2019. Все языки. Электронный ключ
Курс "Oracle. Программирование на SQL и PL/SQL"
Курс "Основы TOGAF® 9"
Microsoft Office 365 Персональный 32-bit/x64. 1 ПК/MAC + 1 Планшет + 1 Телефон. Все языки. Подписка на 1 год. Электронный ключ
Курс "Нотация BPMN 2.0. Ее использование для моделирования бизнес-процессов и их регламентации"
 

О нас
Интернет-магазин ITShop.ru предлагает широкий спектр услуг информационных технологий и ПО.

На протяжении многих лет интернет-магазин предлагает товары и услуги, ориентированные на бизнес-пользователей и специалистов по информационным технологиям.

Хорошие отзывы постоянных клиентов и высокий уровень специалистов позволяет получить наивысший результат при совместной работе.

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



 

О нас

 
Главная
Каталог
Новинки
Акции
Вакансии
 

Помощь

 
Общая справка
Как оформить заказ
Тарифы доставки
Способы оплаты
Прайс-лист
Карта сайта
 

Способы оплаты

 

Проекты Interface Ltd.

 
Interface.ru   ITShop.ru   Interface.ru/training   Olap.ru   ITnews.ru  
 

119334, г. Москва, ул. Бардина, д. 4, корп. 3
+7 (495) 229-0436   shopadmin@itshop.ru
Проверить аттестат
© ООО "Interface Ltd."
Продаем программное обеспечение с 1990 года