[Moscow.pm] Продолжение размышлений на тему ORM
Ivan Petrov
i.petro.77.00 на gmail.com
Вт Ноя 8 06:16:44 PST 2011
Заспорили мы тут с некоторыми товарищами.
в итоге пришло к тому "возможно или нет" написать генератор запросов.
видимо правы все или неправы все. тут просто вопрос точки зрения.
Я помню на одной из перл-конференций один умный человек читал лекцию
про трансгуманизм. Там была хорошая мысль: не стоит гнаться за
оптимизацией, если дело можно решить мегафлопсами. Они всегда
дешевле.
В каких-то нишах он прав. Вероятно для этих же ниш подойдет и DBIC.
Вот. Ну а для ниш, где флопсы выделенные БД таки не решают всеж-таки
ваяем шаблонный движок для работы с SQL.
Сперва мы тут ваяли движок с собственным шаблонным языком.
Затем применяя его на практике пришли к тому что собственный язык -
плохо, надо идти по пути Mojo. То есть встраиваемый перл.
В итоге пришли вот к такому синтаксису.
SELECT
*
FROM
table
WHERE
id = <%= $id %>
где $id - именованный параметр переданный запросу.
Ну или даже так:
SELECT
% if ($type eq 'count') {
COUNT(*) AS count
% } else {
*
% }
FROM
table
WHERE
sid = 123
% if ($filter->filter1) {
AND field1 = <%= $filter->filter1 %>
% }
% if ($filter->filter2) {
AND field2 = <%= $filter->filter2 %>
% }
Получается более изящно и сильно более гибко, однако цена этому в
примерно в полтора-два раза бОльшее время на парсинг. Впрочем для
сложных SQL оно сравнимо (у старого парсера оно оосло в зависимости от
сложности, тут слабо зависит).
SQL-ки размещены в выделенной директории, имеют фиксированное (пока)
расширение '.sql.ep' и DBI расширен тремя допметодами
- select - выборка набора данных (аналог selectall_(hash|array)ref)
- single - выборка одной строки (аналог selectrow_hashref)
- perform - выполнение SQL-запроса (аналог do)
Покамест на выходе простые итераторы, позволяющие сделать просто
проход по выборке, а объекты просто предоставляют доступ к выбранным
полям (AUTOLOAD). В планах сделать отложенные SQL-запросы ну и более
расширить API итераторов (сейчас они частично DBIC совместимые).
Если кому интересно, то модуль лежит на CPAN - DBIx::DR.
Ссылки на git нет. Git - в закрытом проекте. unfortunatelly.
Замечания, предложения крайне интересны :)
Спорить по поводу того что некрута писать SQL-запросы руками больше не
буду :)
Подробная информация о списке рассылки Moscow-pm