2013-03-26 5 views
0

Я ищу идеи для правильной обработки обновлений таблицы mysql моего проекта в разных средах. Я взглянул на класс CI DB Forge, и я считаю, что может помочь мне немного. Мои мысли заключаются в следующем:сценарии обновления базы данных проекта codeigniter

  1. создать новый файл для каждой установки базы данных, обновления или изменения таблицы. Файл будет содержать необработанный MySQL запрос, чтобы сделать каждую соответствующую задачу
  2. запустить сценарии обновления через крючки перед любыми контроллерами загружены
  3. продолжить загрузку проекта

Является ли это правильное мышление? Это довольно похоже на то, как Magento обрабатывает обновления баз данных на каждое расширение.

+0

Если вы достаточно дисциплинированы, чтобы выписывать SQL для каждого изменения, отлично. Если у вас несколько окружений, хотя (более 2), даже этого может быть недостаточно. В последнее время я использовал инструменты сравнения mysql workbench db для переноса изменений в базе данных; он работает достаточно хорошо. –

+0

Я использую среду разработки, тестирования и производства. Изменения в базе данных просты по своей природе, и я обрабатывал их только путем копирования/вставки через Navicat. Я просто ищу больше ** профессиональных **, чтобы справиться с этим. Инструмент Workbench фактически создает запрос sql для исправления обновлений? –

+0

Я только что узнал, что Navicat имеет инструменты Data & Structure Compare и Sync, встроенные в версию, которая у меня отличная, но мне все еще нравится программное решение. –

ответ

4

Похоже, что вы ищете Migrations class. Это довольно новая библиотека, и документация на данный момент не слишком хороша, на мой взгляд.

Если вы включите эту библиотеку в application/config/migrations.php и загрузите ее, она создаст таблицу базы данных с именем migrations. Рабочий оттуда следующее:

  1. Создать новый файл под application/migrations убедитесь, что вы называете его с последовательно нумеруются имя файла, как 001_some_descriptive_name.php. Формат важен, ровно 3 номера и по крайней мере один _ после них.
  2. В новом файле создайте класс с именем после имени файла, поэтому 001_some_descriptive_name.php должен содержать класс Migration_Some_descriptive_name и расширить класс CI_Migration. Корпус с именем класса важен, сначала Migration_, затем один верхний регистр письмо, затем строчный.
  3. Создать общественный up и общественный down метод внутри класса
  4. Внутри вверх метод добавить код миграции, который изменяет базу данных. Вы можете использовать библиотеку db forge или просто старые звонки $this->db->query(). Dbforge более портативен, если вам нужно поддерживать несколько систем баз данных, вероятно, лучше использовать их.
  5. Внутри метода down добавить код, который будет отменять эффекты up. Если up добавляет столбец, то down должен удалить этот столбец, если up создает таблицу, down должен удалить эту таблицу и т. Д.
  6. После того как вы закончили свой класс миграции, удалите migration_version внутри файла конфигурации миграции.
  7. Создайте загрузки контроллера библиотеку миграции и вызвать $this->migration->current() это будет проверять версию из таблицы базы данных migration и запустить классы миграции up или down метод для того, чтобы достичь версии миграции в конфигурационном файле вы установили на шаге 6. Так например, если в базе данных указано, что вы находитесь в версии 2, а в конфиге говорится, что вы должны быть на 5, тогда он будет запускать метод миграции из 003_..., 004_..., 005_... Если вы установите более низкое число, то будут вызываться текущие методы down. База данных начинает подсчет с 0, поэтому не создавайте файл 000_....

Если вы чувствуете приключений вы можете создать крюк, который загружает класс миграции и запускает get_instance()->migration->latest() на каждой странице поэтому каждая среда будет обновлять БД автоматически, как только вы развернуть новый класс миграции.

+0

Да, это именно то, что мне нужно! Не уверен, как я пропустил это, но я собираюсь отдать это. Спасибо за очень подробный и полезный отчет ... Вы использовали это самостоятельно в любых проектах? –

+0

Пока нет, я только совершил небольшую пробную поездку. – complex857

+0

Является ли 'Migration_Some_descriptive_name' правильным именем класса? Он не содержит числа. В файле это самая важная часть ... – Rudie

Смежные вопросы