С разработчиками symfony и propel у меня слишком разные взгляды на типичные ошибки и полноту документации. Полтора часа, что бы обнаружить, что поле таблицы названо зарезервированным словом – это слишком много.
А дело было так.
Делаю таск (т.е. скрипт), что бы пропинговать некоторое количество доменов. Делаю запрос к базе – получить домен. Не проходит. Код элементарный, типа такого.
$criteria=new Criteria();
$criteria->add(DomainPeer::CHECKED,false);
$page=DomainPeer::doSelectOne($criteria);
Причем не проходит именно запрос.
[wrapped: SQLSTATE[HY000]: General error: 1 near «INDEX»: syntax error]
Делаю запрос одного домена в консоли – работает. Понятно – дело в запросе, который генерит пропель. Тут бы мне и догадаться что дело в зарезервированном слове, но мозг работает только на один шаг вперёд.
Нужно посмотреть, какой запрос происходит. Благо, узнать в symfony, какой запрос делает propel можно элементарно
$c = clone $criteria;
$params=array();
if (!$c->hasSelectClause()) DomainPeer::addSelectColumns($c);
echo BasePeer::createSelectSql($c,$params);
Но как найти эту функцию – createSelectSql, когда ты ещё не знаешь её названия? Я полагаю, что это должно быть в документации. Однако листание оной ни к чему не привело. Открыв гугл я просто понял свою беспомощность перед задачей – сформулировать вопрос.
symfony show builded sql query
symfony propel show query
criteria get result query
propel criteria get query
propel criteria getquery
criteria итоговый запрос
show sql symfony
Максимум, что находится – смотрите в логах или веб-панели. Но логов нет. Что ж, то, что логов в тасках нет, я знал и ранее, но не знал, почему. Тут бы мне залезть в кишки ORM, поставить пару var_dump и всё-таки выяснить, какой запрос делается к базе. Но решил разобраться, как включить логи. Я полагаю, что это должно быть в документации. Однако листание оной ни к чему не привело. Открыв гугл я просто понял свою беспомощность перед задачей – разобрать миллион страниц, отвечающих не на тот вопрос.
enable logs for tasks symfony
get setting value symfony
tasks site:symfony-project.org
enable log tasks symfony
enable logging tasks symfony
Все страницы радостно рассказывают мне про опцию logging_enabled, которую достаточно включить. Про неё, конечно, я знал и ранее и она, конечно, не помогает, иначе история была б вдвое короче. Но вот почему она не помогает? Я полагаю, что это должно быть в документации. Однако листание оной ни к чему не привело. Открыв гугл я просто понял свою беспомощность перед задачей – найти ответ на вопрос, который никто не задавал.
logging_enabled tasks symfony
Решил понять, почему не работают логи, сделав запись в логи самостоятельно. Сделать это не сложно.
sfConfig::set(’sf_logging_enabled’,true);
if (sfConfig::get(’sf_logging_enabled’))
{
sfContext::getInstance()->getLogger()->info(«test»);
}
И код этот выдаёт ошибку, мол The «default» context does not exist. Вот только почему в тасках нет контекста? Я полагаю, что это должно быть в документации. Однако листание оной ни к чему не привело. Открыв гугл я просто понял, какой они предоставляют замечательный сервис – можно всегда легко и просто найти ответ на интересующий тебя вопрос
The «default» context does not exist. symfony.
$configuration = ProjectConfiguration::getApplicationConfiguration(‘work’, ‘dev’, true);
sfContext::createInstance($configuration);
Делаем контекст, смотрим логи (после создания контекста опция logging_enabled обрела смысл и логи появились). В логах пусто. Какой-то хлам и ни слова про запрос. Нужен ход конём – делаем тестовый модуль и наконец-то открываем наш сомнительный код через браузер. Видим и полные логи и веб-дебаггер.
Apr 24 04:31:58 symfony [err] {sfPropelLogger} SQLSTATE[HY000]: General error: 1 near «INDEX»: syntax error
Apr 24 04:31:58 symfony [err] {PropelException} [wrapped: SQLSTATE[HY000]: General error: 1 near «INDEX»: syntax error]
Забавно, ведь это мы уже видели в самом начале. К тому же прошло уже почти полтора часа и пришла пора догадываться. Стало понятно, что без кишков не обойтись. Трейс-лог показал мне, где искать нужный мне код – открыл BasePeer, открыл там функцию doSelect, перед $con->prepare($sql) поставил echo $sql. Тот запрос, который появился на странице, вбил в консоль и сразу всё увидел – sqlite-у не нравится, что у меня одна из колонок называется INDEX.
Спасибо за внимание.
156