我DBIx::Class在Web上下文中使用,我想显示执行的SQL查询的数量以及它们为呈现页面所花费的时间.
有关如何实现这一点的任何想法?
如果连接到MySQL:
my $schema = MyDatabase::Main->connect("dbi:mysql:database=$database;host=$host",'root','', {mysql_enable_utf8 => 1});
Run Code Online (Sandbox Code Playgroud)
连接被强制为utf8;
连接到SQLite:
my $schema = MyDatabase::Main->connect('dbi:SQLite:data/sample.db', {sqlite_unicode => 1});
Run Code Online (Sandbox Code Playgroud)
连接似乎不在utf8中;
目的是消除在获取数据时必须使用decode():from:
Mojo::ByteStream->new($cycle->type)->decode('utf-8')
Run Code Online (Sandbox Code Playgroud)
至:
$cycle->type
Run Code Online (Sandbox Code Playgroud)
谢谢
我认为我在TT模板中使用了太多的条件和计算.
我正在显示DBIc中的项目结果集.对于每个项目,我需要使用检索到的值来计算事物,并且模板似乎不是正确的位置.
但在Catalyst中,它是一个来自DBIc的厚对象.
那么如何将逻辑移到模型中呢?我必须为所有项目运行一个完整的循环并以某种方式更改对象吗?
问候:Migue,
在我们的MySQL数据库中,我有一个third_party_accounts表和它has_many third_party_campaigns.但是,并非所有帐户都有广告系列.我想要做的DBIx::Class只是选择那些有一个或多个广告系列的帐户.最简单的是我发现如下:
my $third_party_account_rs = $schema->resultset('ThirdPartyAccount');
my $with_campaigns_rs = $third_party_account_rs->search(
{ third_party_account_id => \'IS NOT NULL' },
{
join => 'third_party_campaigns',
group_by => 'me.id',
}
);
Run Code Online (Sandbox Code Playgroud)
对于相关的数据库列:
mysql> select id from third_party_accounts;
+----+
| id |
+----+
| 1 |
| 2 |
| 3 |
+----+
3 rows in set (0.00 sec)
mysql> select id, third_party_account_id from third_party_campaigns;
+----+------------------------+
| id | third_party_account_id |
+----+------------------------+
| 1 | 1 |
| 2 | …Run Code Online (Sandbox Code Playgroud) 有人可以解释一下程序员在DBIx :: Class模块的文件SQLite.pm中使用这个变体"包名"的目标吗?完整列表:
package # Hide from PAUSE
DBIx::Class::SQLAHacks::SQLite;
use warnings;
use strict;
use base qw( DBIx::Class::SQLMaker::SQLite );
1;
Run Code Online (Sandbox Code Playgroud)
为什么在'package'之后将包的名称写在其他行?
我正在使用DBIx :: Class来检索结果,如下所示:
my $users = $c->model('DB::User')->search(
{ active_yn => 'y', client_yn => 'n' },
{
columns => [qw/id first_name last_name username email/],
order_by => ['last_name'],
page => ($c->req->param('page') || 1),
rows => 20,
}
);
Run Code Online (Sandbox Code Playgroud)
但是,一旦我得到结果,我想知道已经返回了多少,但我似乎无法找到一个告诉我的方法.有谁知道如何$users在执行此查询后得到计数?谢谢!
在我的项目中,我有3个表:艺术家,专辑和曲目
结果艺术家:
...
__PACKAGE__->has_many(
'albums' => 'MYLIB::DB::Schema::Result::MyDir::Album',
{ 'foreign.artist_id' => 'self.id', },
);
...
Run Code Online (Sandbox Code Playgroud)
结果专辑:
...
__PACKAGE__->belongs_to(
'artist' => 'MYLIB::DB::Schema::Result::Artist',
{ 'foreign.id' => 'self.artist_id', },
);
__PACKAGE__->has_many(
'tracks' => 'MYLIB::DB::Schema::Result::MyDir::Track',
{ 'foreign.album_id' => 'self.id', },
);
...
Run Code Online (Sandbox Code Playgroud)
结果跟踪:
__PACKAGE__->belongs_to(
'album' => 'MYLIB::DB::Schema::Result::MyDir::Album',
{ 'foreign.id' => 'self.album_id', },
);
Run Code Online (Sandbox Code Playgroud)
现在我有了一个对象$artist,我想通过ID获取Track.
查询示例:
SELECT * FROM Tracks WHERE track_id = $x
我正在进行一项生物信息学项目,该项目要求我从各种生物体中读取基因组数据(没有太多花哨,只需将其视为字符串)并将其插入数据库中.每次读取属于一个生物体,并且可以包含5000到5000万个基因,我需要在储存之前对其进行处理和分析.
目前执行此操作的脚本是用perl编写的,并且在完成所有计算之后,将结果存储在散列中,如下所示:
$new{$id}{gene_name} = $id;
$new{$id}{gene_database_source} = $gene_database_source
$new{$id}{product} = $product;
$new{$id}{sequence} = $sequence;
$new{$id}{seqlength} = $seqlength;
$new{$id}{digest} = $digest;
$new{$id}{mw} = $mw;
$new{$id}{iep} = $iep;
$new{$id}{tms} = $tms;
Run Code Online (Sandbox Code Playgroud)
在读取所有基因之后,插入将通过散列循环到eval {}语句中.
eval {
foreach my $id (keys %new) {
my $rs = $schema->resultset('Genes')->create(
{
gene_name => $new{$id}{gene_name},
gene_product => $new{$id}{product},
sequence => $new{$id}{sequence},
gene_protein_length => $new{$id}{seqlength},
digest => $new{$id}{digest},
gene_isoelectric_point => $new{$id}{iep},
gene_molecular_weight => $new{$id}{mw},
gene_tmd_count => $new{$id}{tms},
gene_species => $species,
species_code => $spc,
user_id => $tdruserid,
gene_database_source …Run Code Online (Sandbox Code Playgroud) 我想从表中选择MIN()和MAX()列.但是,我只想在一次查询中解决这个问题,而不是两次查询数据库.
我知道我能做到这一点
my $col = $schema->result_source("Birthday")->get_column("birthdate");
my $min = $col->min();
my $max = $col->max();
Run Code Online (Sandbox Code Playgroud)
但它会查询数据库两次.
我发现的唯一其他解决方案是非常丑陋,通过搞乱select和as属性search().例如
my $res = $rs->search({}, {
select => [ {min => "birthdate"}, {max => "birthdate"},
as => [qw/minBirthdate maxBirthdate/]
});
say $res->get_column("minBirthdate")->first() . " - " . $res->get_column("maxBirthdate")->first();
Run Code Online (Sandbox Code Playgroud)
产生这个 - 我想要的SQL
SELECT MIN(birthdate), MAX(birthdate) FROM birthdays;
Run Code Online (Sandbox Code Playgroud)
有没有更优雅的方式来完成这项工作DBIx::Class?
为了使其更冷,有没有办法尊重色谱柱的膨胀/放气?
我正在使用DBIx::Class::Schema::Loader创建这样的架构:
#!/usr/bin/perl
use strict;
use warnings;
use DBIx::Class::Schema::Loader qw/make_schema_at/;
make_schema_at(
"Mydb::Schema",
{debug => 0, dump_directory => "../db/",
generate_pod => 0,},
["dbi:mysql:mydb:localhost:3306", 'mydb', 'password'],
);
Run Code Online (Sandbox Code Playgroud)
我在 MySQL 中的表名是people,但是当我运行此代码时,生成的类名为Mydb::Schema::Result::Person:
$ cat Mydb/Schema/Result/Person.pm
use utf8;
package Mydb::Schema::Result::Person;
# Created by DBIx::Class::Schema::Loader
# DO NOT MODIFY THE FIRST PART OF THIS FILE
use strict;
use warnings;
use base 'DBIx::Class::Core';
__PACKAGE__->table("people");
__PACKAGE__->add_columns(
"pplid",
{
data_type => "smallint",
extra => { unsigned => 1 },
is_auto_increment => 1,
is_nullable => …Run Code Online (Sandbox Code Playgroud)