繁体   English   中英

用于Perl的SQL查询生成器,支持存储过程

[英]SQL query generator for Perl with stored procedures support

我正在处理的当前代码库充满了临时条件字符串连接,产生的查询不是很清晰。 我想让它们可维护,但由于使用DBIx :: Class过于复杂而无法继续使用(巨型遗留基础),我希望至少通过使用某种SQL生成器使它们更加健壮,这只会通过面向对象或任何其他干净技术创建SQL(无需DB处理)。

对该生成器的一个一般约束是能够以理智的方式使用存储过程,因为我的应用程序主要基于那些。 例如,我需要SELECT * FROM StoredProcedure(Parameter) WHERE ... 我已经研究过Fey :: SQLSQL :: Abstract和其他一些,但是对于这种语句,除了“内联SQL”之外还没有看到任何支持。 我也没有看到对EXECUTE ...任何支持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%' );

你会推荐什么?

您可以尝试SQL :: Abstract 它对于简单的SQL语句很好

我认为主要的问题是我不明白什么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 ( ?, ?, ? ) )

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM