Symfony — мигрируем таблицы на продакшен

Admin MySQL, Бэкенд Обсудить

Опишу установку локальной миграции на сервер. Некоторые нюансы заставляют не мало потратить времени. Зная их, можно этого избежать.

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

Этап 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 — мигрируем таблицы на продакшен"
Если вам нужно добавить участок кода ставьте его между тегами <code></code>