[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