1

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

该生成器的一个一般限制是能够以理智的方式使用存储过程,因为我的应用程序主要基于这些。例如,我需要SELECT * FROM StoredProcedure(Parameter) WHERE .... 我研究了Fey::SQLSQL::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%' );

你会推荐什么?

4

2 回答 2

3

您可以尝试SQL::Abstract。非常适合简单的 SQL 语句

于 2009-10-30T21:12:24.660 回答
1

我认为主要问题是我不明白是什么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 ( ?, ?, ? ) )
于 2009-10-30T21:16:26.260 回答