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 — мигрируем таблицы на сервер"