Вам не повезло!!
Во-первых, удалите все внешние ключи из всех таблиц, которыми управляет D2. Скопируйте и выполните результат этого запроса:
SET SESSION group_concat_max_len=8192; -- // increase this if you do not see the full list of your tables
SELECT IFNULL(REPLACE(GROUP_CONCAT('ALTER TABLE ',TABLE_NAME,' DROP FOREIGN KEY ',CONSTRAINT_NAME,'; '), ',', ''), '') FROM information_schema.TABLE_CONSTRAINTS WHERE CONSTRAINT_TYPE='FOREIGN KEY';
Затем переопределите метод supportsForeignKeyConstraints() в /vendor/doctrine-dbal/lib/Doctrine/DBAL/Platforms/MySqlPlatform.php (или в другом месте, где находится этот класс), чтобы:
public function supportsForeignKeyConstraints()
{
return false;
}
Это не позволит Doctrine создавать ограничения внешнего ключа для вашей следующей команды doctrine:schema:update. После этого вы можете просто выполнить оператор ALTER TABLE PARTITION BY..., где это необходимо (D2 не поддерживает секционирование на уровне схемы). Я рекомендую вам сначала создать резервную копию и усечь свои таблицы (используя --no-create-info), чтобы изменения структуры выполнялись как можно быстрее, а затем восстановить их.
Как говорит этот парень здесь и исходя из моего личного опыта, D2 не волнует, есть ли у вас FK или нет, если есть правильные определения отношений.
PS: В настоящее время я работаю над расширением синтаксиса аннотаций для поддержки правильных определений таблиц и столбцов, включая ENGINE (это может быть полезно), PARTITION BY и массив @Column options (т.е. {"fixed"=true, "unsigned"=true, "default"=0})
Общие усилия составляют пару бессонных ночей для обратного проектирования и исправления кода, надеюсь, вы сделаете это быстрее :)
person
Shellcat
schedule
20.03.2013