2010-09-22 3 views
1

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

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

+0

YAML не является форматом базы данных. Что происходит с этим YAML, который является «автоматическим приращением»? Его где-то помещают в фактическую базу данных? – Gareth

+1

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

+1

@Jan Fabry Этого не происходит с Propel. Propel сохраняет поколение sql полностью независимым от вставки sql, поэтому вы можете легко поселиться в середине и сделать свое дело, и те изменения, которые вы сделаете, вступят в силу. В Доктрине говорится, что она должна работать одинаково, но на самом деле шаги создания и ввода sql не очень чисто разделены. – jblue

ответ

2

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

Еще более простой способ (реализовать, возможно, не выполнять) - это создать отдельный файл с именами таблиц и базовыми значениями, который считывается a new Symfony task you write, который создает и выполняет необходимые запросы. Просто не забудьте выполнить эту задачу после создания базы данных, но перед загрузкой светильников. И обновлять файл конфигурации каждый раз, когда вы добавляете таблицу.

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

+0

@jblue: Я не могу найти ссылки на него в исходном коде Propel, поэтому я не думаю, что у него есть эта функция. Одной из причин его поддержки может быть совместимость между поставщиками (вам нужно будет эмулировать ее в других средах). Но Propel позволяет информацию о конкретном поставщике в схеме и в настоящее время [построитель MySQL] (http://www.propelorm.org/browser/tags/1.5.4/generator/lib/builder/sql/mysql/MysqlDDLBuilder.php # L106) использует это для доступа к дополнительным функциям. Поэтому я думаю, что получить поддержку для значений автоматического увеличения инкремента должно быть легко, если вы создадите билет и напишите список разработчиков. –

+0

Прочтите мои комментарии к моему основному вопросу. Это можно сделать, настроив sql между генерацией sql и sql. Мы попробовали его с Doctrine, но у него была ошибка, поэтому мы попробовали ее с Propel, и все получилось отлично. Мой коллега, выполняющий эту работу, решил перейти на Propel по этой причине, потому что мы решили, что возможность тонкой настройки sql по мере необходимости важна для нас по дороге для проекта. – jblue

0

Вы можете попытаться установить AutoIncrement вручную в базе данных, затем дамп файла Schema и посмотреть, что он выводит в YML для установленного AutoIncrement.

Команда дамп схемы является symfony doctrine::build-schema

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