12 Миграции базы данных
Миграции — это удобный способ изменения вашей базы данных структурированным и организованным способом.
Часто в процессе разработки нам необходимо обновлять изменения в рабочей среде. Некоторые из этих изменений могут касаться изменений в базе данных: новые поля, новые таблицы, удаление индексов и т. д.
При миграции создается набор классов, чтобы описать, как ваша база данных структурирована в данный момент. Эти классы могут использоваться для синхронизации структуры схемы в удаленных базах данных и подготовки вашей базы данных к работе с новыми изменениями, которые реализует ваше приложение. Миграции описывают эти изменения с использованием простого PHP.
Сохранение схемы БД
Phalcon Developer Tools предоставляет скрипты для управления миграциями (генерация, запуск и откат).
Доступные опции для генерации миграций:
Запуск скрипта без каких-либо параметров делает простой дамп каждого объекта (таблиц и представлений) из вашей базы данных в классы миграции.
Каждая миграция имеет версию — идентификатор, который с ней ассоциируется. Номер версии позволяет нам определить, является ли миграция старше или новее текущей версии нашей базы данных. Версии также сообщают Phalcon о рабочем состоянии при выполнении миграции.
При генерации миграции, в консоли отображаются инструкции, описывающие шаги миграции, и время их выполнения. В конце концов, версия миграция будет создана.
По умолчанию Phalcon Developer Tools использует директорию app/migrations
для сохранения файлов миграции. Вы можете изменить расположение, установив один из параметров по генерации скрипта. Каждая таблица в базе данных имеет свой соответствующий класс, созданный в отдельном файле директории, ссылающейся на её версию:
Структура класса Migration
Каждый файл содержит уникальный класс, расширяющий класс Phalcon\Mvc\Model\Migration
. Эти классы обычно имеют два метода: up()
и down()
. up()
выполняет миграцию, а down()
выполняет ее откат.
up()
также содержит магический метод morphTable()
. Магия возникает, когда она распознает изменения, необходимые для синхронизации фактической таблицы в базе данных с описанием.
<?php 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 |
Массив c набором столбцов таблицы. | Нет |
indexes |
Массив с набором индексов таблицы. | Да |
references |
Массив с набором связей таблицы (внешние ключи). | Да |
options |
Массив с набором параметров создания таблицы. Эти параметры часто связаны с системой баз данных, в которой была создана миграция. | Да |
Определение столбцов
Phalcon\Db\Column используется для определения столбцов таблицы. Он инкапсулирует широкий спектр функций, связанных со столбцами. Его конструктор получает в качестве первого параметра имя столбца и массив, описывающий столбец. При описании столбцов доступны следующие параметры:
Свойство | Описание | Опционально |
---|---|---|
type |
Тип столбца. Должна быть константой Phalcon\Db\Column (см. ниже) | Нет |
size |
Размер, который указывается для некоторые типов столбцов, таких как VARCHAR или INTEGER |
Да |
scale |
Количество десятичных знаков после запятой для столбцов DECIMAL или NUMBER |
Да |
unsigned |
INTEGER columns may be signed or unsigned. This option does not apply to other types of columns |
Да |
notNull |
Может ли столбец содержать значения Null? | Да |
default |
Значение по умолчанию для столбца (Должно быть конкретизировано. Использование функций, таких как NOW() , не допускается) |
Да |
autoIncrement |
С помощью этого атрибута столбец будет заполнен автоматически с автоинкрементным целым числом. Только один столбец в таблице может иметь этот атрибут. | Да |
primary |
Sets this column as a primary key index using columnName_pkey as identifier. Type - BOOLEAN |
Да |
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 |
The referenced table maybe is on another schema or database. This option allows you to define that. | Да | Все адаптеры |
onDelete |
Если внешняя запись удалена, выполняет это действие с локальной записью (записями). | Да | MySQL PostgreSQL |
onUpdate |
Если внешняя запись обновлена, выполняет это действие с локальной записью (записями). | Да | MySQL PostgreSQL |
Запись миграций
Миграции предназначены не только для преобразования таблиц. Миграция-это обычный PHP класс, поэтому вы не ограничены этими функциями. Например, после добавления столбца можно написать код для задания значения этого столбца для существующих записей. Для более подробной информации и примеров отдельных методов, обратитесь к разделу Уровень абстракции базы данных.
<?php use Phalcon\Mvc\Model\Migration; class ProductsMigration_100 extends Migration { public function up() { // ... self::$_connection->insert( 'products', [ 'Malabar spinach', 14.50, ], [ 'name', 'price', ] ); } }
Запуск миграций
После загрузки созданных миграций на целевой сервер их можно легко запустить, как показано в следующем примере:
В зависимости от того, насколько устарела база данных в отношении миграции, Phalcon может запускать несколько версий миграции в одном процессе миграции. Если указать целевую версию, Phalcon будет выполнять необходимые миграции до достижения указанной версии.