如何在DBIx :: Class中调用Postgres函数

时间:2015-04-26 12:04:19

标签: perl postgresql dbix-class

我目前正在使用DBIx::Class,我想知道如何使用DBIx在某个数据库模式中调用现有的Postgres函数。

我的DBI代码:

my $table = $self->{dbh}->quote_identifier(
                    undef,
                    'foo',
                    'myFunction'
                    );

my $sqlst = qq{ SELECT foobar FROM $table($some_data); };

到目前为止我找到的东西是使用从我的DBIx::Class::Schema对象中检索到的dbh对象来调用所述函数:

my $return_data = {};

my $sql = qq{SELECT foobar FROM "foo"."myFunction"($some_data)};

$self->{schema}->storage->dbh_do( sub {
    my ($storage, $dbh) = @_;
    $menu_list = $dbh->selectrow_hashref(
        $sql,
        { slice => {} }
    );
});

有比这更好/更容易的解决方案吗?

我也偶然发现了DBIx::ProcedureCall,但在使用数据库架构时我无法使用它。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

如果您想使用SQL Functions as Table Sources,应该可以像这样创建虚拟DBIx::Class::ResultSource::View

package MyApp::Schema::Result::MyFunction;

use base qw/DBIx::Class::Core/;

__PACKAGE__->table_class('DBIx::Class::ResultSource::View');

__PACKAGE__->table('myFunction');
__PACKAGE__->result_source_instance->is_virtual(1);
__PACKAGE__->result_source_instance->view_definition(
    'SELECT foobar FROM "foo"."myFunction"(?)'
);
__PACKAGE__->add_columns(
    'foobar' => {
        data_type => 'varchar',
    },
);

视图可以像这样使用:

my $rs = $schema->resultset('MyFunction')->select({}, {
    bind => [ 'arg' ],
});

这将创建一个非常必要的子查询:

SELECT me.foobar FROM (SELECT foobar FROM "foo"."myFunction"(?)) me

但我认为它应该有用。