我需要使用DBIx :: Class运行纯SQL:
select proc_name();
有没有办法用DBIx::Class
执行此操作?
UPD
我知道我可以与DBI
进行不同的连接,然后:
$dbh->do( 'select proc_name();' )
但我需要在同一个交易中运行它
UPD
FAQ不包括
UPD
对于downvoters:我知道DBIx::Class
不适用于纯SQL。但是从某一方面来看,有时查询过于复杂而不能像DBIx::Class
那样重写它,另一方面我们需要DBIx::Class
的功能
答案 0 :(得分:2)
感谢{dbix-class IRC频道上的mst
寻求帮助。
我应该使用dbh_do
my @stuff = $schema->storage->dbh_do(
sub {
my ($storage, $dbh, @cols) = @_;
my $cols = join(q{, }, @cols);
$dbh->selectrow_array("SELECT $cols FROM foo");
},
@column_list
);
UPD
DBIx::Class::Report模块建议另一种方法来运行复杂查询并获取行的DBIx::Class::Result
个对象
UPD
可能DBIx::Raw也很有趣
答案 1 :(得分:0)
运行纯SQL并获得DBIx::Class
功能的另一种方法是使用::View
package MyApp::Schema::Result::Year2000CDs;
use base qw/DBIx::Class::Core/;
__PACKAGE__->table_class('DBIx::Class::ResultSource::View');
__PACKAGE__->table('year2000cds');
__PACKAGE__->result_source_instance->is_virtual(1);
__PACKAGE__->result_source_instance->view_definition(
# PUT HERE YOUR QUERY
"SELECT cdid, artist, title FROM cd WHERE year ='2000'"
);
__PACKAGE__->add_columns(
'cdid' => {
data_type => 'integer',
is_auto_increment => 1,
},
'artist' => {
data_type => 'integer',
},
'title' => {
data_type => 'varchar',
size => 100,
},
);
这是Ovid的blog post