Доработок в этом модуле не слишком много, но я решил выделить их в отдельную статью. Все-таки это один из основных модулей Kohana.
Базовые изменения
- Исправлено зацикливание с последующей ошибкой
out of memory
. Если в системе добавленDatabase Config Reader
, то он теперь не пытается считывать настройки подключения к БД (отсекается группа настроек ‘database‘). #4316 - Для определения необходимости ведения статистических замеров (profiling) модуль теперь использует централизованную настройку
Kohana::$profiling
(устанавливается вKohana::init()
). В 3.2 модульDatabase
имел собственный параметр ‘profiling‘ в конфиге. #4203 - В методах
compile($db)
семейства классовDatabase_Query
параметр$db
сделан опциональным. Кроме того, он может являться не объектомDatabase
, а строкой (т.е. именем соответствующего профиля в конфиге). Такая логика уже присутствовала в методеexecute($db)
. #3872
Напомню, метод
compile()
преобразовывает условия запросаQuery_Builder
‘а в SQL-строку, но не выполняет запрос, а возвращает сгенерированный текст. - В
Query_Builder
появился еще один метод для работы с группами условий. В 3.2 имеются методыwhere_open()
,and_where_open()
,or_where_open()
иwhere_close()
. Они позволяют объединять условия в группы, напримерWHERE (`a` > 0 OR `b` < 0) AND `c` == 1
. Иногда возникает потребность формировать такие группы условий динамически (например, обработка данных с формы поиска). И может возникнуть ситуация, когда группа создана (вызваны методыwhere_open()
иwhere_close()
), а внутри условий нет. Во избежание подобных ситуаций был добавлен методwhere_close_empty()
. Если внутри группы есть хоть одно условие, то он действует аналогичноwhere_close()
. #4052 - Database-драйверы для
Config
иSession
, а также модели (Model_Database
) по умолчанию теперь используют профильDatabase::$default
. Ранее было жестко прописано значение 'default'. #4289 - Повышено качество phpDoc-комментариев.
PDO
- В драйвер PDO можно передать дополнительные параметры (см driver_options). Используйте ключ
['connection']['options']
. #4372 - Для PDO параметр 'charset' в конфиге неактулен. Устанавливайте его через DSN, либо в доп. параметрах (
['connection']['options']['charset']
). #4078
PS. Пока негусто. Если в последующих RC или в финальной версии будут еще изменения, они будут добавлены в данную статью.
Когда уже сделают поддержку PDO-драйвера в ОРМ?
А что именно они должны сделать? Насколько я знаю, нет универсального способа в PDO получить список полей таблицы. Есть два варианта — прописать вручную свойство
$_table_columns
(ключи — имена полей, значения могут быть любыми), либо сделать свой драйвер на основе PDO.Универсального способа нет, но список поддерживаемых субд известен и небольшой — почему бы сразу не добавить для каждой из? Без требования пользователям каждый раз делать одно и то же, что может быть единожды сделано в самом фреймворке?
В трекере я не нашел тикетов с данной проблемой. Почему бы не предложить pull request разработчикам? По собственным ощущениям, они задачи с уже предложенным вариантом решения обрабатывают намного быстрее, чем просто предложения/сообщения об ошибках.
Все субд я не осилю, но решение с постгрей у меня есть. Раньше ещё были с ораклом и мускулем
ps: про тикеты — не надо, кохановская дев-тим состоит из снобов чуть менее, чем полностью. Чтобы доказать, что оно того стоит — придётся потратить уйму сил.
Дык если не создать даже тикет, как можно требовать от разработчиков нужных изменений? Можно отправить pull request и начать обсуждение на оф. форуме. Найдутся желающие потратить «уйму сил» на допиливание и внедрение этой фичи. Тем более, что скоро 3.3, надо успеть ))
Я уже как минимум один раз тикет создавал. Он был закрыт как wontfix
Мол уважаемые разработчики — таскайте каждый свою реализацию из проекта в проект.
Видишь ещё проблема в чём — ОРМ в принципе под сферической субд в вакууме работать не будет. К примеру count_all на нормальных субд зафейлится, потому что после добавления COUNT(*) он ещё и table_name.* дорисовывает.
Потому, чтобы всё было честно, нужно ещё и орм переписать. Хотя в твиторе зомбор и писал, что текущий орм попахивает, но хз когда его хотя бы надумают переписать нормально, с тестами.
Ага, нашел этот тикет. Могу предложить разве что организовать Pull Request с уже готовыми драйверами для PDO. Например, у тебя уже есть Postgre, я для мускула быстро набросаю. На форуме вроде как есть SQLite-драйвер.
А по поводу ORM — вопрос больной. Ведь по сути его особо не трогали в третьей ветке. Мало кому охота все там переделывать, насколько я понимаю.
Хм. Проверил в 3.3 — нет такого. Генерируется
SELECT COUNT(*) AS records_found FROM ...
Вот кстати ещё один пример раздолбайского отношения к DB & ORM в дев-тиме: http://dev.kohanaframework.org/issues/4445
tl;dr: with() ломает запрос, фикс тривиальный показал. Они упёрлись, из принципа (разумных причин не фиксить не было и нет)
Вообще, очень много зависших тикетов, которые были один раз просмотрены, и потом их просто не замечают. Вчера решил пересмотреть свои старые тикеты, и запулил Pull Request для одного из них (для Userguide). В итоге, ночью Вуди его вмержил в 3.2 и 3.3.
Получается, надо пинать постоянно разработчиков. Один отказался, другой примет.