Миграции базы данных
Миграции — удобный способ изменения вашей базы данных структурированным и организованным образом.
Важно: Миграции доступны в Инструментах разработчика Phalcon. Для использования инструментов разработчика вам необходима как минимум версия Phalcon Framework 0.5.0. Также рекомендуется иметь установленную PHP 5.3.11 или более позднюю версию.
Часто в процессе разработки нам необходимо обновлять изменения в производственных средах. Некоторые из этих изменений могут быть модификациями базы данных, такими как новые поля, новые таблицы, удаление индексов и т. д.
При создании миграции создается набор классов, описывающих структуру вашей базы данных на данный момент. Эти классы могут использоваться для синхронизации структуры схемы на удалённых базах данных, подготавливая вашу базу данных к работе с новыми изменениями, которые реализует ваше приложение. Миграции описывают эти преобразования с помощью обычного PHP.
Экспорт схемы
Инструменты разработчика Phalcon предоставляют скрипты для управления миграциями (генерация, выполнение и откат).
Доступные варианты генерации миграций:
Выполнение этого скрипта без каких-либо параметров просто экспортирует все объекты (таблицы и представления) из вашей базы данных в классы миграций.
Каждая миграция имеет идентификатор версии, связанный с ней. Номер версии позволяет определить, является ли миграция более новой или более старой, чем текущая «версия» нашей базы данных. Версии также информируют Phalcon о порядке выполнения при выполнении миграции.
При генерации миграции на консоли отображаются инструкции, описывающие различные шаги миграции и время выполнения этих инструкций. В конце генерируется версия миграции.
По умолчанию Инструменты разработчика Phalcon используют директорию app/migrations для экспорта файлов миграции. Вы можете изменить расположение, установив один из параметров в скрипте генерации. Каждая таблица в базе данных имеет свой соответствующий класс, сгенерированный в отдельном файле в директории, обозначающей его версию:
Структура класса миграции
Каждый файл содержит уникальный класс, который расширяет 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")
);
}
}
Выполнение миграций
После загрузки сгенерированных миграций на целевой сервер вы можете легко выполнить их, как показано в следующем примере:
В зависимости от того, насколько устарела база данных по отношению к миграциям, 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