Миграция схемы БД: 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-пользователя.
  • 29.11.2014 00:11:12 Сергей:
    А для можно как то подробнее описать как запустить, в конфиге ввел доступы к 1-й бд ко 2-й не нашел где вводить, в браузере открываю migration.php
    Пишет
    ) Warning: array_shift() expects parameter 1 to be array, null given in E:\Servera\OpenServer\domains\migration\MMP-master\lib\Helper.class.php on line 48
    Call Stack
    # Time Memory Function Location
    1 0.0000 336448 {main}( ) ..\migration.php:0
    2 0.0030 481832 Helper::parseCommandLineArgs( ) ..\migration.php:6
    3 0.0030 482616 array_shift ( ) ..\Helper.class.php:48

    ( ! ) Warning: fwrite() expects parameter 1 to be resource, string given in E:\Servera\OpenServer\domains\migration\MMP-master\lib\Output.class.php on line 12
    Call Stack
    # Time Memory Function Location
    1 0.0000 336448 {main}( ) ..\migration.php:0
    2 0.0060 528536 Output::error( ) ..\migration.php:19
    3 0.0060 528760 fwrite ( ) ..\Output.class.php:12
  • 16.12.2014 20:10:21 Олег:
    Ваш продукт все еще поддерживается?
    Хочу применить его на своем проекте, но сомневаюсь...
  • 11.03.2015 15:28:05 Maks:
    Сергей, скрипт должен запускаться из командной строки. Не пытайтесь открывать его в браузере. На гитхабе есть документ по использованию. Ссылка на гитхаб в тексте.
  • 11.03.2015 15:30:09 Макс:
    Олег, поддерживается. Лично моего участия не осталось, но энтузиасты на гитхабе продолжают его пилить.