Php doctrine migration down

Миграции

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

Они будут сохранять все изменения базы в специальных php файлах и выполнив их всегда можно получить актуальное состояние базы. В Symfony для управления миграциями используется DoctrineMigrationsBundle. Подробнее с ним можно познакомить на страницах официальной документации

1. Установка

 composer require doctrine/doctrine-migrations-bundle "^2.0" 

2. Настройка

После установки автоматически происходит подключение бандла в файле config/bundles.php

 // config/bundles.php return [ // . Doctrine\Bundle\MigrationsBundle\DoctrineMigrationsBundle::class => ['all' => true], // . ]; 

Настройку можно произвести в файле config/packages/doctrine_migrations.yaml, который создается автоматически.
Стандартные настройки выглядят следующим образом:

 # config/packages/doctrine_migrations.yaml doctrine_migrations: dir_name: '%kernel.project_dir%/src/Migrations' # namespace is arbitrary but should be different from App\Migrations # as migrations classes should NOT be autoloaded namespace: DoctrineMigrations 

3. Базовое использование

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

 php bin/console make:entity 

Далее мы отвечает на соответствующие вопросы и получаем в результате примерно следующее:

 Add another property? Enter the property name (or press to stop adding fields): > deleted Field type (enter ? to see all types) [string]: > integer Can this field be null in the database (nullable) (yes/no) [no]: > true updated: src/Entity/AppBundleNews.php Add another property? Enter the property name (or press to stop adding fields): > Success! Next: When you're ready, create a migration with php bin/console make:migration 

Вводим команду для создания миграции.

 php bin/console doctrine:database:create Created database `rest_api` for connection named default MacBook-Pro-Vaceslav-4:rest-api soprantsov$ php bin/console make:migration Success! Next: Review the new migration "src/Migrations/Version20201004180202.php" Then: Run the migration with php bin/console doctrine:migrations:migrate See https://symfony.com/doc/current/bundles/DoctrineMigrationsBundle/index.html 

В результате мы получили php файл миграции, который имеет следующий вид:

 namespace DoctrineMigrations; use Doctrine\DBAL\Schema\Schema; use Doctrine\Migrations\AbstractMigration; /** * Auto-generated Migration: Please modify to your needs! */ final class Version20201004180202 extends AbstractMigration < public function getDescription() : string < return ''; >public function up(Schema $schema) : void < // this up() migration is auto-generated, please modify it to your needs $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); $this->addSql('CREATE TABLE app_bundle_news (id INT AUTO_INCREMENT NOT NULL, name VARCHAR(255) NOT NULL, anons LONGTEXT DEFAULT NULL, publish DATETIME DEFAULT NULL, content LONGTEXT NOT NULL, active INT DEFAULT NULL, deleted INT NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB'); > public function down(Schema $schema) : void < // this down() migration is auto-generated, please modify it to your needs $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); $this->addSql('DROP TABLE app_bundle_news'); > > 

4. Запуск миграции

 php bin/console doctrine:migrations:migrate 

Функция up() выполняется при запуске миграции и создает таблицу в базе, а down() — при откате миграции, она удаляет таблицу новостей. Давайте протестируем их.

 php bin/console doctrine:migrations:migrate Application Migrations WARNING! You are about to execute a database migration that could result in schema changes and data loss. Are you sure you wish to continue? (y/n)y Migrating up to 20201004180202 from 0 ++ migrating 20201004180202 -> CREATE TABLE app_bundle_news (id INT AUTO_INCREMENT NOT NULL, name VARCHAR(255) NOT NULL, anons LONGTEXT DEFAULT NULL, publish DATETIME DEFAULT NULL, content LONGTEXT NOT NULL, active INT DEFAULT NULL, deleted INT NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB ++ migrated (took 71.6ms, used 18M memory) ------------------------ ++ finished in 75.8ms ++ used 18M memory ++ 1 migrations executed ++ 1 sql queries 

5. Откат миграции

А теперь откатим изменения, для этого нужно узнать версию последней миграции, потом запустить команду:

 doctrine:migrations:execute --down 

c флагом —down

 php bin/console doctrine:migrations:latest 20201004180202 MacBook-Pro-Vaceslav-4:rest-api soprantsov$ php bin/console doctrine:migrations:execute 20201004180202 --down WARNING! You are about to execute a database migration that could result in schema changes and data lost. Are you sure you wish to continue? (y/n)y -- reverting 20201004180202 -> DROP TABLE app_bundle_news -- reverted (took 25ms, used 18M memory) 

6. Добавление поля

В дальнейшем нам может понадобится добавить дополнительные поля к нашим сущностям.
Добавим поле «Дата удаления» к нашим новостям.

 /** * Дата удаления * @var $deleted_date \DateTime * @ORM\Column (type="datetime", nullable=true) */ private $deleted_date; 

Сгенерируем геттеры и сеттеры

 php bin/console make:entity App --regenerate 

Обычно для каждого проекта я использую 2 базы данных, для разработики и тестов, а также для prod режима.

 php bin/console doctrine:schema:update --force 

Далее необходимо создать миграцию изменений базы. Для режима dev используется команда:

 php bin/console doctrine:migrations:diff -e prod 

Теперь накатим миграцию на продакшн

 php bin/console doctrine:migrations:migrate -e prod 

На этом вроде как все, успехов в работе.

Источник

Symfony. Консольные команды для работы с миграциями.

Doctrine ORM предоставляет разработчику удобные средства выборки данных. Это и мощный DQL для работы в объектно-ориентированном ключе, и удобный Query Builder, простой и понятный в использовании. Они покрывают большую часть потребностей, но иногда возникает необходимость использовать SQL запросы, оптимизированные или специфичные для конкретной СУБД. Для работы с результатами запросов в коде важно понимание того, как работает маппинг в Doctrine.

Что такое миграции? Это что-то вроде системы контроля версий для вашей базы данных. Они позволяют вашей команде изменять структуру БД, в то же время оставаясь в курсе изменений других участников. Миграции обычно идут рука об руку с построителем структур для более простого обращения с архитектурой вашей базы данных. Если вы когда-нибудь просили коллегу вручную добавить столбец в его локальную БД, значит вы сталкивались с проблемой, которую решают миграции БД.

Команды Symfony для работы с Doctrine

php bin/console list doctrine — Выводит все возможные консольных команд для работы с Doctrine.

php bin/console doctrine:query:sql -h — Любая консольная команда с ключом -h выведет подробную справку по команде.

php bin/console make:entity — Создает новую сущность Entity для таблиц в БД. Также команда позволяет добавить новые свойства в уже существующий Entity.

php bin/console doctrine:cache:clear — Очищает кеш Doctrine.

php bin/console doctrine:database:create — Создает структуру БД через Doctrine.

php bin/console doctrine:database:drop — Удаляет БД через Doctrine.

php bin/console doctrine:database:import — Импортирует файлы SQL непосредственно в базу данных.

php bin/console doctrine:ensure-production-settings — Проверяет, что Doctrine правильно настроена для production среды

php bin/console doctrine:fixtures:load — Загружает fixtures в БД.

php bin/console doctrine:fixtures:load —append

php bin/console doctrine:fixtures:load —purge-with-truncate

php bin/console doctrine:query:sql -V

Команды Symfony для работы с миграциями

php bin/console make:migration — Создает файл миграции с SQL кодом

php bin/console doctrine:migrations:migrate — Выполняет все миграции (будут применены только ранее не выполненные) (одним из вариантов использования: эту команду следует запускать на продакшене при развертывании).

php bin/console doctrine:migrations:execute —up 20200405164707 — Применяет конкретную миграцию, для этого после —up передаем аргументом номер миграции (20200405164707).

php bin/console doctrine:migrations:execute —down 20200405164707 — Откатывает конкретную миграцию, для этого после —down передаем аргументом номер миграции (20200405164707).

php bin/console doctrine:migration:generate — Создает шаблон файла миграции (будет без sql кода)

Источник

Консольные команды в Symfony 5 для работы с Doctrine.

ORM Doctrine в Symfony 5 это прекрасный инструмент для работы с БД разных видов в ООП-стиле. Для эффективной и комфортной работы в Symfony 5 предусмотрено большое количество консольных команд.

Для работы с Doctrine, требуются определенные пакеты в зависимостях проекта. Их легко добавить выполнив 2 следующие команды:

 composer require symfony/orm-pack composer require --dev symfony/maker-bundle

Ниже будут представлены часто употребляемые консольные команды в Symfony 5 с описанием.

Для всех консольных команд, можно посмотреть подробный процесс выполнения, для этого требуется передать после консольной команды передать -vvv (ключ вербозно). Например подробно отследить ход выполнения миграций: php bin/console doctrine:migrations:migrate -vvv .

Оцените статью