Опишу установку локальной миграции на сервер.
Исходим из того, что соединение с базой данных у нас уже настроено. А таблицы миграции и всю остальное залито на сервер.
Этап 1 — настройка
В консоли смотрим текущий статус того, что будет изменено на проде:
Информация будет выведена в 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. Например, так:
dbal:
url: '%env(DATABASE_URL)%'
server_version : '5.4'
charset: utf8
default_table_options:
charset: utf8
collate: utf8_unicode_ci
Если не указать версию MySQL, то при дальнейшей миграции могут посыпаться ошибки:
Если подключение к БД происходит через .env, то там версия MySQL указан в последнем параметре.
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 — Проверка
Запускаем проверку миграции:
Если миграция не произведена, то будет указано так:
[ERROR] The database schema is not in sync with the current mapping file.
Этап 3 — Миграция
Тут все ок, поэтому запускаем миграцию:
Используем атрибут 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.
!
Имеются иные более безопасные варианты миграции. Используйте этот на свой страх и риск.