Perl DBIx::使用函数更新充气列
我试图通过Perl DBIx::使用函数更新充气列,perl,postgresql,dbix-class,Perl,Postgresql,Dbix Class,我试图通过update\u或\u new函数模拟此SQL UPDATE user SET lastseen = GREATEST( lastseen, ?::timestamp ) WHERE userid = ? 它在充气列上给出一个错误,表示它无法在undef上调用is_∞ $schema->resultset('user')->update_or_new( { userid => 'peter', lastseen => \[ 'GREATEST(
update\u或\u new
函数模拟此SQL
UPDATE user SET lastseen = GREATEST( lastseen, ?::timestamp ) WHERE userid = ?
它在充气列上给出一个错误,表示它无法在undef
上调用is_∞
$schema->resultset('user')->update_or_new( {
userid => 'peter',
lastseen => \[ 'GREATEST( lastseen, ?::timestamp )', DateTime->from_epoch(epoch => 1234) ]
} );
我猜这是因为
InflateColumn::DataTime
不希望在那里有函数。对于这个问题,有没有干净的解决方法?这是DBIx::Class(此处提到:)中的一个bug,修复程序被合并了。在下一个版本中应该可以。
也就是说,如果您使用的是DBIx::类,请转储SQL。设置环境变量DBIX_TRACE=1以查看其发送内容的跟踪。在尝试执行sql之前,它在放气/充气时死亡。它的DBIC_TRACE=1,但无论如何,DateTime->from_epoch(1234)是不正确的。如果您想使用那个相当奇怪的历元,您需要DateTime->from_epoch(历元=>1234)<代码>$perl-MDateTime-E'say DateTime->from_epoch(1234)'DateTime::from_epoch调用中的奇数个参数,当需要命名参数时[…]DateTime::from_epoch(undf,1234)在-e第1行调用,这就是为什么充气不起作用的原因,因为您在日期时间失败,所以您正在传递undefconstructor@mikew这是一个问题的输入错误。我已经编辑并更正了它。
my $dtf = $schema->storage->datetime_parser; #https://metacpan.org/pod/DBIx::Class::Storage::DBI#datetime_parser
my $user_rs = $schema->resultset('User')->search({ userid => 'peter' });
my $dt = DateTime->from_epoch(epoch => 1234);
#select count(*) where userid = 'peter';
if( $user_rs->count ) {
$user_rs->update(
lastseen => \[ 'GREATEST( lastseen, ? )', $dtf->format_datetime($dt) ]
);
} else {
$user_rs->create({ lastseen => $dt });
}