Symfony — мигрируем таблицы на сервер

Admin MySQL, Symfony

Опишу установку локальной миграции на сервер.

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

Исходим из того, что соединение с базой данных у нас уже настроено. А таблицы миграции и всю остальное залито на сервер.

Этап 1 — настройка

В консоли смотрим текущий статус того, что будет изменено на проде:

bin/console doctrine:schema:update --dump-sql

Информация будет выведена в sql синтаксисе, например:

CREATE TABLE cars (id INT AUTO_INCREMENT NOT NULL, date DATETIME NOT NULL, name LONGTEXT NOT NULL, user_id INT NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB;

CREATE TABLE user (id INT AUTO_INCREMENT NOT NULL, email VARCHAR(255) NOT NULL, username VARCHAR(255) NOT NULL, password VARCHAR(64) NOT NULL, UNIQUE INDEX UNIQ_38329DSDFMEKS (email), UNIQUE INDEX UNIQ_343DFK48349DGSM (username), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB;

Перед продолжением заходим в файле /config/packages/doctrine.yaml и добавляем версию MySQL. Например, так:

doctrine:
    dbal:
        url: '%env(DATABASE_URL)%'
        server_version : '5.4'
        charset: utf8
        default_table_options:
            charset: utf8
            collate: utf8_unicode_ci

Если не указать версию MySQL, то при дальнейшей миграции могут посыпаться ошибки:

Если подключение к БД происходит через .env, то там версия MySQL указан в последнем параметре.

 Updating database schema...

In AbstractMySQLDriver.php line 106:
                                                                                                                                                               
  An exception occurred while executing '     CREATE TABLE user (id INT AUTO_INCREMENT NOT NULL, email VARCHAR(255) NOT NULL, username VARCHAR(255) NOT NULL, password VARCHAR(64) NOT NULL, UNIQUE INDEX UNIQ_38329DSDFMEKS (email), UNIQUE INDEX UNIQ_343DFK48349DGSM (username), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB':                                                                                                    
                                                                                                                                                               
  SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes                                                                                                                                                                                                    

In PDOConnection.php line 80:
                                                                                                                   
  SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes  
                                                                                                                   
In PDOConnection.php line 75:
                                                                                                                   
  SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes

Связано это с тем, что старая версия MySQL не имеет некоторую поддержку новых возможностей. И если явно не указать версию MySQL на продакшене, то могут возникнуть подобные ошибки.

Этап 2 — Проверка

Запускаем проверку миграции:

bin/console doctrine:schema:validate

Если миграция не произведена, то будет указано так:

[ERROR] The database schema is not in sync with the current mapping file.

Этап 3 — Миграция

Тут все ок, поэтому запускаем миграцию:

bin/console doctrine:schema:update --force

Используем атрибут force иначе на проде команда не запустит процесс и появится предупреждение:

! [CAUTION] This operation should not be executed in a production environment!
!
!
!
! Use the incremental update to detect changes during development and use
!
! the SQL DDL provided to manually update your database in production.
!

Имеются иные более безопасные варианты миграции. Используйте этот на свой страх и риск.

Если вам пригодилась информация, вы можете поблагодарить автора сайта символическим пожертвованием:

Добавить комментарий

Напишите свой комментарий, если вам есть что добавить/поправить/спросить по теме текущей статьи:
"Symfony — мигрируем таблицы на сервер"