Spec-Zone.ru › Phalcon 2

Миграции базы данных

Миграции — удобный способ изменения вашей базы данных структурированным и организованным образом.

Важно: Миграции доступны в Инструментах разработчика Phalcon. Для использования инструментов разработчика вам необходима как минимум версия Phalcon Framework 0.5.0. Также рекомендуется иметь установленную PHP 5.3.11 или более позднюю версию.

Часто в процессе разработки нам необходимо обновлять изменения в производственных средах. Некоторые из этих изменений могут быть модификациями базы данных, такими как новые поля, новые таблицы, удаление индексов и т. д.

При создании миграции создается набор классов, описывающих структуру вашей базы данных на данный момент. Эти классы могут использоваться для синхронизации структуры схемы на удалённых базах данных, подготавливая вашу базу данных к работе с новыми изменениями, которые реализует ваше приложение. Миграции описывают эти преобразования с помощью обычного PHP.

Экспорт схемы

Инструменты разработчика Phalcon предоставляют скрипты для управления миграциями (генерация, выполнение и откат).

Доступные варианты генерации миграций:

../_images/migrations-1.png

Выполнение этого скрипта без каких-либо параметров просто экспортирует все объекты (таблицы и представления) из вашей базы данных в классы миграций.

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

../_images/migrations-2.png

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

По умолчанию Инструменты разработчика Phalcon используют директорию app/migrations для экспорта файлов миграции. Вы можете изменить расположение, установив один из параметров в скрипте генерации. Каждая таблица в базе данных имеет свой соответствующий класс, сгенерированный в отдельном файле в директории, обозначающей его версию:

../_images/migrations-3.png

Структура класса миграции

Каждый файл содержит уникальный класс, который расширяет Phalcon\Mvc\Model\Migration. Эти классы обычно имеют два метода: up() и down(). Метод up() выполняет миграцию, а down() отменяет её.

Метод up() также содержит магический метод morphTable(). Магия заключается в том, что он распознает необходимые изменения для синхронизации фактической таблицы в базе данных с описанием, заданным в классе.

use Phalcon\Db\Column as Column;
use Phalcon\Db\Index as Index;
use Phalcon\Db\Reference as Reference;

class ProductsMigration_100 extends \Phalcon\Mvc\Model\Migration
{

    public function up()
    {
        $this->morphTable(
            "products",
            array(
                "columns" => array(
                    new Column(
                        "id",
                        array(
                            "type"          => Column::TYPE_INTEGER,
                            "size"          => 10,
                            "unsigned"      => true,
                            "notNull"       => true,
                            "autoIncrement" => true,
                            "first"         => true,
                        )
                    ),
                    new Column(
                        "product_types_id",
                        array(
                            "type"     => Column::TYPE_INTEGER,
                            "size"     => 10,
                            "unsigned" => true,
                            "notNull"  => true,
                            "after"    => "id",
                        )
                    ),
                    new Column(
                        "name",
                        array(
                            "type"    => Column::TYPE_VARCHAR,
                            "size"    => 70,
                            "notNull" => true,
                            "after"   => "product_types_id",
                        )
                    ),
                    new Column(
                        "price",
                        array(
                            "type"    => Column::TYPE_DECIMAL,
                            "size"    => 16,
                            "scale"   => 2,
                            "notNull" => true,
                            "after"   => "name",
                        )
                    ),
                ),
                "indexes" => array(
                    new Index(
                        "PRIMARY",
                        array("id")
                    ),
                    new Index(
                        "product_types_id",
                        array("product_types_id")
                    )
                ),
                "references" => array(
                    new Reference(
                        "products_ibfk_1",
                        array(
                            "referencedSchema"  => "invo",
                            "referencedTable"   => "product_types",
                            "columns"           => array("product_types_id"),
                            "referencedColumns" => array("id"),
                        )
                    )
                ),
                "options" => array(
                    "TABLE_TYPE"      => "BASE TABLE",
                    "ENGINE"          => "InnoDB",
                    "TABLE_COLLATION" => "utf8_general_ci",
                )
            )
        );
    }

}

Класс называется «ProductsMigration_100». Суффикс 100 относится к версии 1.0.0. Метод morphTable() получает ассоциативный массив с 4 возможными разделами:

ИндексОписаниеНеобязательно
“columns”Массив с набором столбцов таблицыНет
“indexes”Массив с набором индексов таблицыДа
“references”Массив с набором ссылок на таблицу (внешние ключи)Да
“options”Массив с набором параметров создания таблицы. Эти параметры часто связаны с системой баз данных, в которой была сгенерирована миграция.Да

Определение столбцов

Phalcon\Db\Column используется для определения столбцов таблицы. Он инкапсулирует широкий спектр функций, связанных со столбцами. Конструктор принимает в качестве первого параметра имя столбца и массив, описывающий столбец. При описании столбцов доступны следующие параметры:

ПараметрОписаниеНеобязательно
“type”Тип столбца. Должен быть константой Phalcon_Db_Column (см. ниже)Нет
“size”Некоторые типы столбцов, такие как VARCHAR или INTEGER, могут иметь определенный размерДа
“scale”Столбцы DECIMAL или NUMBER могут иметь масштаб, чтобы указать, сколько знаков после запятой должно хранитьсяДа
“unsigned”Столбцы INTEGER могут быть со знаком или без знака. Этот параметр не применяется к другим типам столбцовДа
“notNull”Столбец может хранить значения NULL?Да
“autoIncrement”С этим атрибутом столбец будет автоматически заполняться целым числом с автоинкрементом. Только один столбец в таблице может иметь этот атрибут.Да
“first”Столбец должен быть помещен в первую позицию в порядке столбцовДа
“after”Столбец должен быть помещен после указанного столбцаДа

Миграции базы данных поддерживают следующие типы столбцов базы данных:

  • Phalcon\Db\Column::TYPE_INTEGER
  • Phalcon\Db\Column::TYPE_DATE
  • Phalcon\Db\Column::TYPE_VARCHAR
  • Phalcon\Db\Column::TYPE_DECIMAL
  • Phalcon\Db\Column::TYPE_DATETIME
  • Phalcon\Db\Column::TYPE_CHAR
  • Phalcon\Db\Column::TYPE_TEXT

Определение индексов

Phalcon\Db\Index определяет индексы таблиц. Для индекса требуется только определить имя и список его столбцов. Обратите внимание, что если любой индекс имеет имя PRIMARY, Phalcon создаст первичный ключ в этой таблице.

Определение ссылок

Phalcon\Db\Reference определяет ссылки на таблицу (также называемые внешними ключами). Для определения ссылки можно использовать следующие параметры:

ИндексОписаниеНеобязательно
“referencedTable”Самоописательно. Ссылается на имя таблицы, на которую ссылаются.Нет
“columns”Массив с именами столбцов в таблице, имеющих ссылкуНет
“referencedColumns”Массив с именами столбцов в таблице, на которую ссылаютсяНет
“referencedTable”Таблица, на которую ссылаются, может находиться в другой схеме или базе данных. Этот параметр позволяет это определить.Да

Написание миграций

Миграции предназначены не только для «морфинга» таблиц. Миграция — это просто обычный класс PHP, поэтому вы не ограничены этими функциями. Например, после добавления столбца вы можете написать код для установки значения этого столбца для существующих записей. Более подробную информацию и примеры отдельных методов см. в компоненте базы данных.

class ProductsMigration_100 extends \Phalcon\Mvc\Model\Migration
{

    public function up()
    {
        //...
        self::$_connection->insert(
            "products",
            array("Malabar spinach", 14.50),
            array("name", "price")
        );
    }

}

Выполнение миграций

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

../_images/migrations-4.png
../_images/migrations-5.png

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

© 2011–2016 Phalcon Framework Team
Licensed under the Creative Commons Attribution License 3.0.
https://docs.phalconphp.com/en/2.0.0/reference/migrations.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API