[英]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.