Как автоматизировать миграцию (схему и данные) для приложения PHP / MySQL - PullRequest
22 голосов
/ 05 мая 2009

У меня есть приложение на PHP / MySQL. Я ищу способ автоматического обновления базы данных за приложением. Мне не нужно иметь совместимость со старыми версиями после обновления.

Я прочитал Джеффа и K. статей Скотта Аллена об этом.

Я все еще не уверен, как реализовать это для приложения PHP / MySQL.

Есть ли простой и хороший процесс для этого?

Ответы [ 11 ]

18 голосов
/ 05 мая 2009

У меня есть объект «Схема», который я использую, но вы можете сделать то же самое без классов.

Что вы хотите сделать, это создать таблицу 'db_schema_versions':

CREATE TABLE db_schema_versions (
  `table` varchar(255) NOT NULL PRIMARY KEY, 
  `version` INT NOT NULL
)

После того, как ваша база данных может отслеживать, какая версия # включена, она может автоматически обновлять SQL.

Вам следует заблокировать таблицу схем при обновлении схемы. Таким образом, у вас не будет двух запросов одновременно при попытке обновить схему.

Итак - следите за версией, с которой вы обновляетесь - создайте большой переключатель - что-то вроде этого:

class SNTrack_Db_Schema extends MW_Db_Schema_Abstract {
  protected $table = "sntrack_db_schema";
  protected $version = 5;

  protected function upgrade($fromVersion) {
    // don't break
    switch($fromVersion) {
      case 0:
        $this->db->query('CREATE TABLE sntrack_inbound_shipment (
            `id` INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
            `from` VARCHAR(255) NOT NULL,
            `date` DATE NOT NULL,
            `invoice` VARCHAR(255) NOT NULL,
            `notes` TEXT
          )');
        $this->setVersion(1);
      case 1:
        $this->db->query('ALTER TABLE sntrack_details ADD `shipment_id` INT');
        $this->db->query('ALTER TABLE sntrack_product ADD `inventory` INT NOT NULL DEFAULT 0');
        $this->db->query('CREATE TABLE sntrack_inventory_shipment (
            `shipment_id` INT NOT NULL,
            `product_id` INT NOT NULL,
            `qty` INT NOT NULL,
            PRIMARY KEY (`shipment_id`, `product_id`)
          )');
        $this->setVersion(2);
...etc
4 голосов
/ 06 мая 2009

По аналогии с предложением gnarf я бы запустил следующее:

  • Для каждого изменения схемы создайте файл SQL, который при запуске перенесет вас из старой версии в новую версию (это может быть один файл для основной версии или множество небольших изменений).
  • Создайте отдельный файл, перечисляющий каждое из имен файлов SQL в порядке их применения (самый старый вверху, самый новый внизу)
  • Создайте простую таблицу «версий» (все, что для этого нужно - один столбец VARCHAR) в вашей базе данных

Теперь вам нужно написать простой скрипт, который работает следующим образом:

  • Запрос таблицы версий для имени последнего примененного файла обновления SQL
  • Если есть более новые файлы изменений SQL, которые нужно запустить, выполните их в последовательности
  • записать имя нового примененного файла SQL

Надеюсь, это имеет смысл

3 голосов
/ 07 декабря 2010

Попробуйте использовать этот инструмент для миграции схемы: https://github.com/idler/MMP/

2 голосов
/ 04 декабря 2012

Я создал крошечный скрипт миграции для MySQL на PHP. Это хорошо для проектов ранней стадии и тех, кто не нуждается (пока) в более сложных сценариях миграции. https://github.com/kennberg/php-mysql-migrate

0 голосов
/ 04 июля 2016

Вы можете попробовать эту библиотеку: mysql-version-control .

Мне нравится этот, потому что он различает схему, основные данные и тестовые данные. Но делает это таким образом, который все еще действительно прост в использовании.

0 голосов
/ 06 января 2016

Я получил ту же цель: перенести большую базу данных (более миллиона строк в некоторых таблицах). Я рассматриваю возможность использования https://phinx.org, который, кажется, хорошо справляется с миграцией схемы, кроме того, он поставляется с опцией отката для безопасности.

0 голосов
/ 19 декабря 2015

MySQL (можно найти на веб-сайте mysql) делает это. Это включает повторяющиеся щелкающие шаги, хотя.

0 голосов
/ 30 декабря 2013

Используйте migratedb https://github.com/malukenho/MigrateDB от @ malukenho

0 голосов
/ 24 октября 2013

Вы также можете использовать бесплатный API SqlQuerySync

или создайте для себя таблицу базы данных, управляющую запросами CREATE / ALTER / DELETE.

0 голосов
/ 26 января 2010

Вы не можете. Вы либо

  1. Записать файлы обновлений со всеми sql, которые были выполнены в исходной среде, а затем выполнить их (упомянутые выше), подобно SVN. Нужен PHP скрипт для выполнения и ручная работа для написания SQL

  2. Выполните последующий анализ обеих сред и предложите пользователю, какие обновления следует перенести. В основном то же самое, что и первый, за исключением того, что у вас есть один большой шаг для миграции, а не много маленьких кусков. SQLyog может анализировать различия как для схемы, так и для данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...