BonBonSlick
@BonBonSlick
Vanilla Web Architect

Alter table с IF условиями?

[notice] Migrating up to DoctrineMigrations\Version20200907062416
[error] Migration DoctrineMigrations\Version20200209084310 failed during Execution. Error: "An exception occurred while executing 'ALTER TABLE useraccounts_v3 ADD IF NOT EXISTS token VARCHAR(255) DEFAULT NULL':

SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IF NOT EXISTS token VARCHAR(255) DEFAULT NULL' at line 1"

In AbstractMySQLDriver.php line 79:
                                                                                                                 
  An exception occurred while executing 'ALTER TABLE useraccounts_v3 ADD IF NOT EXISTS token VARCHAR(255) DEFAU  
  LT NULL':                                                                                                      
                                                                                                                 
  SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manua  
  l that corresponds to your MySQL server version for the right syntax to use near 'IF NOT EXISTS token VARCHAR  
  (255) DEFAULT NULL' at line 1                                                                                  
                                                                                                                 

In PDOConnection.php line 43:
                                                                                                                 
  SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manua  
  l that corresponds to your MySQL server version for the right syntax to use near 'IF NOT EXISTS token VARCHAR  
  (255) DEFAULT NULL' at line 1                                                                                  
                                                                                                                 

In PDOConnection.php line 41:
                                                                                                                 
  SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manua  
  l that corresponds to your MySQL server version for the right syntax to use near 'IF NOT EXISTS token VARCHAR  
  (255) DEFAULT NULL' at line 1


Это связано с тем что несколько проектов из разных команд подключено к одной БД и черт его знает какие там колонки и данные. Поетому дропнуть нельзя как и накатить новые миграции.
Попробовал добавить такие условия IF NOT EXISTS IF EXISTS
$this->addSql('ALTER TABLE member DROP IF EXISTS avatar_url');
        $this->addSql('ALTER TABLE member ADD IF NOT EXISTS first_login_at DATETIME DEFAULT NULL'');
        $this->addSql('ALTER TABLE cron_report ADD IF NOT EXISTS CONSTRAINT FK_B6C6A7F5BE04EA9 FOREIGN KEY (job_id) REFERENCES cron_job (id) ON DELETE CASCADE');

Однако это привело к ошибкам выше.
Так же не ясно что делать с индексами.
$this->addSql('CREATE UNIQUE INDEX UNIQ_302770B57597D3FE ON useraccounts_v3 (member_id)');


Проверять всю таблицы и колонки где более сотни таблиц вручную и придумывать SQL безумие.
Поетому пробовал добавить IFы.

Возможно в Doctrine есть что для этого?
И как правильно накатить миграции не зная что в удаленной базе без ее дропа?
  • Вопрос задан
  • 44 просмотра
Решения вопроса 1
@ComodoHacker
несколько проектов из разных команд подключено к одной БД и черт его знает какие там колонки и данные


В этом и проблема. Вам пора выделить человека, который будет отвечать за дизайн БД и все миграции.

Если же каждая команда работае со своими данными, не связанными друг с другом, то возможен другой вариант. Разнести данные по разным БД или разным схемам.

Узнать в скрипте, есть ли в таблице такая-то колонка или индекс, конечно можно, сделав запрос к системным вьюхам. Но это не отменяет сказанного выше.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
22 окт. 2020, в 13:19
1000 руб./за проект
22 окт. 2020, в 13:10
20000 руб./за проект
22 окт. 2020, в 13:08
80000 руб./за проект