我现在正在玩DBIx::Class,我想知道如何用DBIX调用某个DB模式中现有的PoxGrES函数。
我的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,但是当使用DB模式时,我无法让它工作。
非常感谢您的帮助!
最佳答案
如果您想使用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
但我觉得应该管用。
关于perl - 如何在DBIx::Class中调用Postgres函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29877373/