如何 运行 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
我需要 运行 纯 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