如何 运行 plain/arbitrary SQL 与 DBIx::Class?

How to run plain/arbitrary SQL with DBIx::Class?

我需要 运行 纯 SQL 和 DBIx::Class:

select proc_name();

有没有办法用 DBIx::Class 做到这一点?

UPD
我知道我可以用 DBI 做不同的连接,然后:

$dbh->do( 'select proc_name();' )

但我需要在同一交易中运行它

UPD
FAQ 不包括

UPD
对于反对者:我知道 DBIx::Class 不适合普通的 SQL。但是从一方面来说,有时查询太复杂而无法将其重写为 DBIx::Class 理解,从另一方面来说,我们需要 DBIx::Class

的功能

感谢#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也会很有趣

另一种 运行 普通 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