如何使用DBIx :: Class运行普通/任意SQL?

时间:2018-04-05 12:33:13

标签: perl dbix-class

我需要使用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的功能

2 个答案:

答案 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