簡體   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