2014-08-28 4 views
4

update_or_new 함수에 대해 DBIx::Class에서이 SQL을 에뮬레이트하려고했습니다.DBIx :: Class update 함수로 열을 확대하십시오.

UPDATE user SET lastseen = GREATEST(lastseen, ?::timestamp) WHERE userid = ? 

undefis_infinity를 호출 할 수없는 말을 부풀려 컬럼에 오류가 있습니다.

$schema->resultset('user')->update_or_new({ 
    userid => 'peter', 
    lastseen => \[ 'GREATEST(lastseen, ?::timestamp)', DateTime->from_epoch(epoch => 1234) ] 
}); 

나는 InflateColumn::DataTime이 기능을 기대하지 않기 때문이라고 생각합니다. 이 문제에 대한 해결 방법이 있습니까?

+3

SQL을 덤프하십시오. 환경 변수'DBIX_TRACE = 1'을 설정하여 보내는 내용의 흔적을 확인하십시오. http://search.cpan.org/~ribasushi/DBIx-Class-0.08270/lib/DBIx/Class/Manual/Troubleshooting.pod –

+0

SQL을 실행하기 전에 Deflating/Inflating에서 사망합니다. –

+0

DBIC_TRACE = 1이지만, DateTime-> from_epoch (1234)는 적절하지 않습니다. 그 이상한 신기원을 사용하려면 DateTime-> from_epoch (epoch => 1234)가 필요합니다. DateTime-> from_epoch (1234) ' 명명 된 매개 변수가 예상 될 때 DateTime :: from_epoch 호출에서 이상한 수의 매개 변수 [...] \t DateTime :: from_epoch (undef, 1234)'$ perl -MDateTime -E ' -e line 1'에서 불리는 이유는 당신이 DateTime 생성자 – mikew

답변

0

DBIx :: Class (여기 주소 : https://github.com/dbsrgits/dbix-class/pull/44)의 버그이며 수정 사항이 병합되었습니다. 다음 릴리스에서는 괜찮을 것입니다. 당신이 DBIx를 사용하는 경우 :: 클래스 < = 0.08270 말했다 ...

하기는 update_or_new 사용하고 있지만 행이 이미 존재하는 경우 기능은 의미가 있습니다 : GREATEST(lastseen, ?::timestamp) lastseen가 정의되어 있지 않으면 행 아무튼 아직 존재하지 않습니다.

소스 + 워드 프로세서를 통해 읽었으며 InflateColumn 코드를 회피하고 여전히 바인드 값을 가질 수있는 방법을 찾을 수 없습니다. 스칼라 심판 (\ 'NOW()')으로 리터럴 SQL을 전달할 수 있지만 배열 ref는 전달할 수 없습니다.

가장 좋은 방법은 전달 된 값을 처리/압축 해제하지 않는 the ResultSet's update method instead,을 사용하는 것입니다. 이는 DBIx :: Class :: Row의 해당 "업데이트"와는 다릅니다.

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 }); 
} 
관련 문제