Миграция схемы БД: 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.
Не портирует внешние ключи. И это досадно, в виду того, что при такой миграции для innodb мы теряем все значимые связи.
Но при создании миграции (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
В итоге миграция не создается. В чем может быть причина?
Причина Ворнингов и Фаталов может быть в том,что скрипт не может создать временную базу. Проверьте права MySQL-пользователя.