[英]SQL query generator for Perl with stored procedures support
我正在处理的当前代码库充满了临时条件字符串连接,产生的查询不是很清晰。 我想让它们可维护,但由于使用DBIx :: Class过于复杂而无法继续使用(巨型遗留基础),我希望至少通过使用某种SQL生成器使它们更加健壮,这只会通过面向对象或任何其他干净技术创建SQL(无需DB处理)。
对该生成器的一个一般约束是能够以理智的方式使用存储过程,因为我的应用程序主要基于那些。 例如,我需要SELECT * FROM StoredProcedure(Parameter) WHERE ...
我已经研究过Fey :: SQL , SQL :: 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.