Миграция схемы БД: MySQL+PHP

Мы, программисты, постоянно растем профессионально. Растем мы, растут и наши проекты, растут размеры Баз Данных. Чем больше проект, тем объемнее схема базы данных. Чем больше схема БД — тем труднее отслеживать ее изменения. ПРОБЛЕМКА НАРИСОВАЛАСЬ!

Несколько месяцев назад эта проблема начала мне мешать, и я стал пытать google на предмет mysql php migration, но ничего, что полностью удовлетворяло бы моим потребностям я так и не нашел. Попался интересный проект на google code, но он только создавал пустые PHP-классы с методами migrateUp и migrateDown. Мне такой подход показался интересным, но писать SQL для миграций вручную по моему не правильно. Программа может сравнить две структуры БД? Может! Тогда пускай программа этим и занимается. Именно тогда и было положено начало проекту MMP.

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

Требования к инструменту миграции

  • Минимальный список зависимостей: PHP, MySQL
  • Читабельность кода, который будет создан при генерации класса миграции
  • Возможноть строить миграции именно по схеме БД, ни в коем случае не по конфиг файлу (как schema.yml в Doctrine)
  • Возможность произвольно менять схему базы, затем выстраивать абсолютно такую же схему в других установках приложения.

Итак, сегодня я хочу представить бета-версию проекта Mysql Migration with PHP. Скачать архив с исходным кодом MMP .

Что умеет Mysql Migration with PHP?

  • создавать инициализационную версию схемы
  • инициализировать БД с нуля
  • создавать новые миграции
  • обновляться до определенной даты (как вниз, так и вверх)
  • показывать список существующих версий (миграций)
  • сама генерит SQL-код внутри PHP-классов

Бета версия вполне работоспособна, и проверена мной в паре небольших проектов

max@max:~/src/mmp$ ./migration.php

                    MySQL Migration with PHP
---------------------------------------------------------------------
  help:       display this help and exit
  schema:     create schema for initial migration/installation
  init:       load initial schema (install)
  create:     create new migration
  list:       list available migrations and mark current version
  migrate:    migrate to specified time

In migrate comand you can use strtotime format
Examples:
*********************************************************************
./migrate.php migrate yestarday
./migrate.php migrate -2 hour
./migrate.php migrate +2 month
./migrate.php migrate 20 September 2001
./migrate.php migrate
********************************************************************
Last example will update your database to last version


---------------------------------------------------------------------
Licenced under: GPL v3
Author: Maxim Antonov 

Все настройки храняться в config.ini в таком виде:

max@max:~/src/mmp$ cat config.ini
host=localhost
user=max
password=
db=mmptest
savedir=db
verbose=On
versiontable=dbversion

max@max:~/src/mmp$

Системные требования: PHP-5.3 с поддержкой mysqli. Поясню неочевидные настройки:

  • savedir - папка, где хранить миграции
  • verbose - выдавать ли сообщения в STDOUT
  • versiontable - таблица, которая будет создана в БД для хранения номеров версий.

P.S. Обращаться с вопросами и предложениями можно по адресу max dot antonoff at gmail dot com.

Комменты

  • 03.11.2011 12:50:17 MaxS:
    Не плохо было бы предусмотреть изменение кодировки при соединении с БД
  • 13.03.2012 18:37:32 Maxim Antonov:
    Спасибо. Предусмотрю в конфиге коннекта.
  • 21.03.2012 23:08:40 Алексей:
    Работает на первый взгляд хорошо. Но есть одно но.
    Не портирует внешние ключи. И это досадно, в виду того, что при такой миграции для innodb мы теряем все значимые связи.
  • 22.03.2012 12:03:30 Алексей:
    При создании схемы проблем нет

    Но при создании миграции (create) в логе куча ошибок такого плана:

    Warning: mysqli::query(): Couldn't fetch mysqli in E:\dropbox\WorkingCopies\crm.
    mama-sale.ru\db\lib\AbstractSchema.class.php on line 8

    Warning: AbstractSchema::load(): Couldn't fetch mysqli in E:\dropbox\WorkingCopi
    es\crm.mama-sale.ru\db\lib\AbstractSchema.class.php on line 10
    Fail

    В конце критическая ошибка
    Warning: mysqli::query(): Couldn't fetch mysqli in E:\dropbox\WorkingCopies\crm.
    mama-sale.ru\db\lib\dbDiff.class.php on line 87

    Fatal error: Call to a member function fetch_array() on a non-object in E:\dropb
    ox\WorkingCopies\crm.mama-sale.ru\db\lib\dbDiff.class.php on line 89
    database mamasale_crm_1332402616 has been dropped

    Warning: mysqli::query(): Couldn't fetch mysqli in E:\dropbox\WorkingCopies\crm.
    mama-sale.ru\db\lib\Helper.class.php on line 139

    В итоге миграция не создается. В чем может быть причина?
  • 04.04.2012 09:51:36 Maxim Antonov:
    Вроде с внешними ключами я работу делал. Может быть у вас не последняя версия? Качайте с Bitbucket.

    Причина Ворнингов и Фаталов может быть в том,что скрипт не может создать временную базу. Проверьте права MySQL-пользователя.