Doctrine Schema изменена на автоматическое увеличение идентификатора

Я использую YAML для определения схемы доктрины и хотел бы начать поле id, установленное на auto-increment, с числа, отличного от 0, скажем, 324 (это делается в mysql, выполнив что-то вроде AUTO_INCREMENT=324.

В этой теме групп Google намек на то, что это возможно сделать с command.pre_command event to execute the SQL before fixtures are loaded и ссылками эта страница из документации symfony, но и подсказка, и страница, на которую ссылаются, на самом деле не объясняют известный способ сделать это. Кто-нибудь знает, как это сделать на самом деле?


person jblue    schedule 22.09.2010    source источник
comment
YAML не является форматом базы данных. Что происходит с этим YAML, который автоматически увеличивается? Помещается ли он где-нибудь в реальную базу данных?   -  person Gareth    schedule 22.09.2010
comment
@Jan Fabry, мы перешли с Doctrine на Propel, потому что в Doctrine есть ошибка, из-за которой пользовательские настройки sql для схемы базы данных практически невозможны. Предполагается сгенерировать sql, а затем вставить его, поэтому для точной настройки сгенерированного sql самое подходящее время сделать это после генерации sql, но до вставки sql. Что ж, у Doctrine есть ошибка (не могу назвать это иначе): при выполнении вставки sql она не просто вставляет sql, но также пересматривает ранее сгенерированный файл и добавляет комментарии (редактирует файл снова), так что эти правки перезаписывают пользовательские модификации. С Пропелем такого не бывает.   -  person jblue    schedule 30.09.2010
comment
@Jan Fabry Этого не происходит с Propel. Propel делает генерацию sql полностью независимой от вставки sql, так что вы можете легко добраться до середины и делать свое дело, и внесенные вами изменения вступят в силу. Doctrine говорит, что он должен работать одинаково, но на самом деле этапы генерации и вставки sql не очень четко разделены.   -  person jblue    schedule 30.09.2010
comment
Интересный. Вы сделали это с новой задачей, которую вы выполняете перед вставкой? Возможно, вы могли бы отправить электронное письмо с более подробной информацией в списки рассылки Symfony или Propel, это может быть полезно для других (и, возможно, в новую версию будет включена явная поддержка установки значений автоинкремента).   -  person Jan Fabry    schedule 30.09.2010


Ответы (2)


Похоже, что Doctrine 1 не поддерживает это из коробки, поэтому люди советуют вам подключиться к событию, которое генерирует система задач Symfony CLI при запуске новой задачи (загрузка фикстур). Это будет работать, но я не знаю, может ли это загрузить значение из значения YAML (может быть, обычная «задача создания таблицы» задохнется от дополнительного параметра?). Самый чистый способ сделать это — написать (небольшой) подкласс задачи, которая выполняет материал Doctrine, который понимает дополнительный параметр, который вы передаете в файл YAML. Сначала будет выполнено обычное создание баз данных, а затем установлены базовые значения автоинкремента.

Еще более простым способом (в реализации, а может и не в исполнении) было бы создание отдельного файла с именами таблиц и базовыми значениями, который читается новую задачу Symfony, которую вы пишете, которая создает и выполняет необходимые запросы. Только не забудьте выполнить эту задачу после создания базы данных, но до загрузки фикстур. И обновлять файл конфигурации каждый раз, когда вы добавляете таблицу.

Самым быстрым и грязным способом будет дополнительный SQL-скрипт со всеми запросами и шелл-скрипт, который выполняет все подряд. Но это требует наибольшего обслуживания с вашей стороны.

person Jan Fabry    schedule 23.09.2010
comment
@jblue: я не могу найти ссылки на него в исходном коде Propel, поэтому я не думаю, что у него есть эта функция. Одной из причин, сдерживающих его, может быть совместимость с разными поставщиками (вам нужно будет эмулировать его в других средах). Но Propel допускает в схеме информацию, специфичную для поставщика, и в настоящее время компоновщик MySQL использует это для доступа к дополнительным функциям. Поэтому я думаю, что получить поддержку автоинкрементных начальных значений будет легко, если вы создадите тикет и отправите список разработчиков по почте. - person Jan Fabry; 23.09.2010
comment
Прочитайте мои комментарии к моему основному вопросу. Это можно сделать, настроив sql между генерацией sql и вставкой sql. Мы попробовали его с Doctrine, но у него была ошибка, поэтому мы попробовали его с Propel, и он работал нормально. Мой коллега, выполнявший эту работу, решил перейти на Propel по этой причине, потому что мы решили, что возможность точной настройки sql по мере необходимости была важна для нас в будущем для проекта. - person jblue; 30.09.2010

Вы можете попытаться установить автоинкремент вручную в базе данных, ЗАТЕМ сбросить файл схемы и посмотреть, что он выводит в YML для установленного вами автоинкремента.

Команда для сброса схемы: symfony doctrine::build-schema

Он создаст файл YML в каталоге config/doctrine. Имейте в виду, что он перезапишет файл схемы, который в данный момент находится в этом каталоге, поэтому вы захотите сделать его резервную копию, прежде чем пытаться это сделать.

person jgallant    schedule 22.09.2010