Генератор SQL-запросов для Perl с поддержкой хранимых процедур - PullRequest
1 голос
/ 31 октября 2009

Текущая кодовая база, над которой я работаю, полна специальных конкатенаций условных строк, производящих меньше, чем чистые запросы SQL. Я хочу сделать их ремонтопригодными, но поскольку использование DBIx :: Class слишком сложно для перехода на данный момент (гигантская устаревшая база), я стремлюсь, по крайней мере, сделать их более надежными, используя какой-то вид Генератор SQL, который будет создавать SQL только с помощью объектно-ориентированной или любой другой чистой техники (обработка БД не требуется).

Одним общим ограничением для этого генератора является возможность использовать хранимые процедуры в здравом смысле, поскольку мое приложение в основном основано на них. Например, мне нужно SELECT * FROM StoredProcedure(Parameter) WHERE .... Я изучил Fey :: SQL , SQL :: Abstract и некоторые другие, но не видел никакой поддержки, кроме "встроенного SQL" для такого рода операторов. Также я не видел никакой поддержки EXECUTE ..., даже в DBIx :: Class , в которую я, честно говоря, не могу поверить, возможно, я искал не в тех местах.

Мне действительно понравился подход Fey :: SQL , пока я не обнаружил, что ему нужна какая-то схема:

 $select->select( $user->columns( 'user_id', 'username' ) )
     ->from( $user, $group )
     ->where( $group->group_id, 'IN', 1, 2, 3 )
     ->and  ( $func, 'LIKE', 'smith%' );

Что бы вы порекомендовали?

Ответы [ 2 ]

3 голосов
/ 31 октября 2009

Вы можете попробовать SQL :: Abstract . Это хорошо для простых операторов SQL

1 голос
/ 31 октября 2009

Я думаю, что главная проблема в том, что я не понимаю, что делает function(?). ? есть заполнитель для передачи в хранимую процедуру с именем function? У меня также нет доступа к базе данных, где я могу проверить свое понимание этого. Однако разве следующее не работает?

my $sql = SQL::Abstract->new;

my ($st, @values) = $sql->select(
    \'function(?)',
    '*',
    { group_id => { 'IN' => [ 1 .. 3] } },
);

my $sth = $dbh->prepare($st);
$sth->execute('arg1', @values);

В моем случае $st содержит:

SELECT * FROM function(?) WHERE ( group_id IN ( ?, ?, ? ) )

Если это не сработает, то как насчет:

my ($st, @values) = build_select_for_function(
    function => [ qw(arg1) ],
    '*',
    { group_id => { 'IN' => [ 1 .. 3] } },
);

print $st, "\n";


sub build_select_for_function {
    my ($func, $args, @sql_abstract_args) = @_;
    my $func_str = sprintf '%s(%s)', $func, join(',', @$args);

    my $sql = SQL::Abstract->new;
    $sql->select(
        \$func_str,
        @sql_abstract_args,
    );
}

Выход:

SELECT * FROM function(arg1) WHERE ( group_id IN ( ?, ?, ? ) )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...