Spec-Zone.ru › Phalcon 3

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

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

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

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

При создании миграции создается набор классов, описывающих структуру вашей базы данных в данный момент. Эти классы могут использоваться для синхронизации структуры схемы на удаленных базах данных, подготавливая вашу базу данных к работе с новыми изменениями, которые реализует ваше приложение. Миграции описывают эти преобразования с помощью обычного 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;
use Phalcon\Mvc\Model\Migration;

class ProductsMigration_100 extends Migration
{
    public function up()
    {
        $this->morphTable(
            "products",
            [
                "columns" => [
                    new Column(
                        "id",
                        [
                            "type"          => Column::TYPE_INTEGER,
                            "size"          => 10,
                            "unsigned"      => true,
                            "notNull"       => true,
                            "autoIncrement" => true,
                            "first"         => true,
                        ]
                    ),
                    new Column(
                        "product_types_id",
                        [
                            "type"     => Column::TYPE_INTEGER,
                            "size"     => 10,
                            "unsigned" => true,
                            "notNull"  => true,
                            "after"    => "id",
                        ]
                    ),
                    new Column(
                        "name",
                        [
                            "type"    => Column::TYPE_VARCHAR,
                            "size"    => 70,
                            "notNull" => true,
                            "after"   => "product_types_id",
                        ]
                    ),
                    new Column(
                        "price",
                        [
                            "type"    => Column::TYPE_DECIMAL,
                            "size"    => 16,
                            "scale"   => 2,
                            "notNull" => true,
                            "after"   => "name",
                        ]
                    ),
                ],
                "indexes" => [
                    new Index(
                        "PRIMARY",
                        [
                            "id",
                        ]
                    ),
                    new Index(
                        "product_types_id",
                        [
                            "product_types_id",
                        ],
                    ),
                ],
                "references" => [
                    new Reference(
                        "products_ibfk_1",
                        [
                            "referencedSchema"  => "invo",
                            "referencedTable"   => "product_types",
                            "columns"           => ["product_types_id"],
                            "referencedColumns" => ["id"],
                        ]
                    ),
                ],
                "options" => [
                    "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? Да
“default” Определяет значение по умолчанию для столбца (может быть только фактическим значением, а не функцией, такой как NOW()) Да
“autoIncrement” С этим атрибутом столбец будет автоматически заполнен целым числом с автоинкрементом. Только один столбец в таблице может иметь этот атрибут. Да
“first” Столбец должен быть размещен в первой позиции в порядке столбцов Да
“after” Столбец должен быть размещен после указанного столбца Да

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

  • Phalcon\Db\Column::TYPE_INTEGER
  • Phalcon\Db\Column::TYPE_VARCHAR
  • Phalcon\Db\Column::TYPE_CHAR
  • Phalcon\Db\Column::TYPE_DATE
  • Phalcon\Db\Column::TYPE_DATETIME
  • Phalcon\Db\Column::TYPE_TIMESTAMP
  • Phalcon\Db\Column::TYPE_DECIMAL
  • Phalcon\Db\Column::TYPE_TEXT
  • Phalcon\Db\Column::TYPE_BOOLEAN
  • Phalcon\Db\Column::TYPE_FLOAT
  • Phalcon\Db\Column::TYPE_DOUBLE
  • Phalcon\Db\Column::TYPE_TINYBLOB
  • Phalcon\Db\Column::TYPE_BLOB
  • Phalcon\Db\Column::TYPE_MEDIUMBLOB
  • Phalcon\Db\Column::TYPE_LONGBLOB
  • Phalcon\Db\Column::TYPE_JSON
  • Phalcon\Db\Column::TYPE_JSONB
  • Phalcon\Db\Column::TYPE_BIGINTEGER

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

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

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

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

Индекс Описание Необязательно Реализовано в
“referencedTable” Автоописательно. Ссылается на имя таблицы, на которую ссылаются. Нет Все
“columns” Массив с именами столбцов в таблице, которые имеют ссылку Нет Все
“referencedColumns” Массив с именами столбцов в таблице, на которую ссылаются Нет Все
“referencedSchema” Таблица, на которую ссылаются, может находиться в другой схеме или базе данных. Этот параметр позволяет определить это. Да Все
“onDelete” Если удаляется внешний запис, выполните это действие с локальным записями. Да MySQL PostgreSQL
“onUpdate” Если внешний запис обновляется, выполните это действие с локальным записями. Да MySQL PostgreSQL

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

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

use Phalcon\Mvc\Model\Migration;

class ProductsMigration_100 extends Migration
{
    public function up()
    {
        // ...

        self::$_connection->insert(
            "products",
            [
                "Malabar spinach",
                14.50,
            ],
            [
                "name",
                "price",
            ]
        );
    }
}

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

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

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

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

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

Spec-Zone.ru

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