请考虑以下perl代码:
$schema->txn_begin();
my $r = $schema->resultset('test1')->find({id=>20});
my $n = $r->num;
$r->num($n+1);
print("updating for $$\n");
$r->update();
print("$$ val: ".$r->num."\n");
sleep(4);
$schema->txn_commit();
Run Code Online (Sandbox Code Playgroud)
我期望由于更新受到事务的保护,如果两个进程尝试更新"num"字段,则第二个应该失败并出现一些错误,因为它丢失了竞争.Interbase将此称为"死锁"错误.然而,MySQL会在update()调用上暂停,但在第一个调用commit之后会很乐意继续.然后第二个进程具有num的"old"值,导致增量不正确.注意:
$ perl trans.pl & sleep 1 ; perl trans.pl
[1] 5569
updating for 5569
5569 val: 1015
updating for 5571
5571 val: 1015
[1]+ Done perl trans.pl
Run Code Online (Sandbox Code Playgroud)
两种情况下的结果值都是"1015".这怎么可能是正确的?
这似乎最开始,因为我升级我的DBIx :: Class,我无法弄清楚我做错了什么.
Use of uninitialized value in sprintf at /opt/perl-5.10.1/lib/site_perl/5.10.1/DBIx/Class/InflateColumn/DateTime.pm line 192.
at /opt/perl-5.10.1/lib/site_perl/5.10.1/DBIx/Class/InflateColumn/DateTime.pm line 192
DBIx::Class::InflateColumn::DateTime::_flate_or_fallback('OpusVL::AppKitX::TelecomsBilling::Schema::Result::AsteriskCdr...', '2009-11-13 09:00:00', 'HASH(0x2a85488)', 'parse_%s') called at /opt/perl-5.10.1/lib/site_perl/5.10.1/DBIx/Class/InflateColumn/DateTime.pm line 199
Run Code Online (Sandbox Code Playgroud)
我在结果文件中的列定义是,
package Module1::Schema::Result::AsteriskCdrRecord;
# Created by DBIx::Class::Schema::Loader
# DO NOT MODIFY THE FIRST PART OF THIS FILE
use strict;
use warnings;
use Moose;
use MooseX::NonMoose;
use namespace::autoclean;
extends 'DBIx::Class::Core';
__PACKAGE__->load_components("InflateColumn::DateTime");
__PACKAGE__->table("asterisk_cdr_records");
__PACKAGE__->add_columns(
"record_id",
{
data_type => "integer",
is_auto_increment => 1,
is_nullable => 0,
sequence => "asterisk_cdr_records_record_id_seq",
},
"import_id",
{ data_type => "integer", is_foreign_key …Run Code Online (Sandbox Code Playgroud) 我开始学习DBIx :: Class,我对在相关表中搜索有疑问:
请考虑以下代码:
my $books = $author->search_related('books', { name => 'Titanic' });
my $books = $author->books->search({name => 'Titanic'});
Run Code Online (Sandbox Code Playgroud)
我想要的只是搜索作者的"泰坦尼克号"书籍$author.
这两个搜索返回相同的结果集?
如果是的话,最好的方法是什么?为什么?
如果不是,有什么区别?
我正在使用Perl和Catalyst框架,DBIx类作为ORM,TT作为视图,Postgresql作为DB.
我有一个带有'timestamp without timezone'类型的列,如果我在Postgres中进行手动查询,则列值是这样的格式2012-08-30 21:30:14,但是当我在TT视图文件中打印该值时,我得到它2012-08-30T15:03:13,所以很明显它会被格式化但是通过我究竟无法分辨的.
我想使用Template :: Plugin :: Date格式化输出时间戳,但我得到Catalyst错误:
无法渲染模板"xxx/list.tt2:日期错误 - 错误的时间/日期字符串:期望'h:m:sd:m:y'得到:'2012-08-30T21:28:22'"
代码在xxx/list.tt2中 [% date.format(xxx.created) %]
那么我该如何让它发挥作用呢?提前致谢.
从DBIx :: Class :: ResultSet我们读到:
WARNING
If called on an object, proxies to "new_result" instead, so
my $cd = $schema->resultset('CD')->new({ title => 'Spoon' });
will return a CD object, not a ResultSet, and is equivalent to:
my $cd = $schema->resultset('CD')->new_result({ title => 'Spoon' });
Run Code Online (Sandbox Code Playgroud)
有人可以解释对象和ResultSet之间的区别是什么?
我正在研究Perl的DBI,我看到了以下方法:
selectrow_array
selectrow_arrayref
selectrow_hashref
所有这些都从结果集中返回1行.所以我不明白它们的用处是什么.他们是做某种替代品LIMIT 1吗?
我正在使用该DBIx::Class模块,我正在尝试执行以下查询:
SELECT * FROM MyTable WHERE column > TIMESTAMP
Run Code Online (Sandbox Code Playgroud)
我对Perl非常陌生,DBIx::Class所以我真的只知道如何在列等于值的情况下进行基本选择.如何使用其他比较器进行此操作?
使用DBIx :: Class,谢天谢地,我找到了解决问题的方法.但我相信必须有一个更好的方式.
my $record = $schema->resultset("food")->create({name=>"bacon"});
Run Code Online (Sandbox Code Playgroud)
如何将此记录转换为简单的hashref,而不必在此之后立即进行此调用.
my record = $schema->resultset("food")->search({name=>"bacon"})->hashref_array();
Run Code Online (Sandbox Code Playgroud)
理想情况下,我希望能够编写一个简单的代码片段
{record=> $record}
Run Code Online (Sandbox Code Playgroud)
代替
{record => {name => $record->name, $record->food_id, ...}}
Run Code Online (Sandbox Code Playgroud)
这会让我感到疯狂,因为这个表有很多列.
我试图在一个eval块下放置一些DBIX事务来进行所有事务,如果中间出现问题则不进行.
我有几个交易正在这样做,没有一个给我带来问题.只有一个:
我构建交易的方式相当棘手,而且值得的是,这些实际上是有效的.如果你愿意,我可以发布那段代码,但也许eval块就足够了:
eval {
for (my $sub = 0; $sub < $neuroexam_index; $sub++){
$transactions{neuroexams}{$sub}->insert;
}
} or die $!;
Run Code Online (Sandbox Code Playgroud)
问题是eval [error] Caught exception in pbitdb::Controller::Subjects->add "Died at /home/lioneluranl/svn/pbitdb/pbitdb/script/../lib/pbitdb/Controller/Subjects.pm line 411."在我的控制台中显示错误(),但实际上执行插入.那为什么会这样?
我是 DBIx::Class 的新手。我将它用于 API 以从我的数据库重新调整数据,我想用 DBIC 重新创建一个 SELECT * FROM 表。有了 DBI,它对我来说效果很好。
返回“美丽”数据的最佳方法是什么?
我想以散列数组形式返回数据,例如:
[
{
id => 123,
name => 'name',
....
}
]
Run Code Online (Sandbox Code Playgroud)
但是随着my @rs = $schema->resultset('Product')->all; return \@rs;. 我得到的不是我想要的输出。在使用 Data::Dumper 检查对象时,我得到以下信息:
$VAR1 = bless( {
'_column_data' => {
'name' => 'test',
'id' => 123'
},
'_result_source' => $VAR1->{'_result_source'},
'_in_storage' => 1
}, 'DB::Schema::Result::Product' );
Run Code Online (Sandbox Code Playgroud)
我确定我误解了 DBIC 的概念。
如何仅获取所有列的数据?谢谢大家的帮助!
dbix-class ×10
perl ×10
catalyst ×2
dbi ×2
eval ×1
mysql ×1
postgresql ×1
resultset ×1
transactions ×1