2009-11-03 2 views
1

내 촉매 응용 프로그램에서 mysql 비트 필드에 액세스하려고합니다. 여기에 테이블 정보는 다음과 같습니다DBIx를 사용하여 mysql 비트를 사용하는 방법

SQL :

create table foo{ 
... 
mybitField bit(1) NOT NULL default b'0' 
} 

내 매핑 테이블 :

...

mybitField 
{ 
    data_type => "BIT", 
    default_value => "b'0'", 
    is_nullable => 0, 
    size => undef, 
    } 
... 

지금 내 컨트롤러에서 나는 간단한

$c->stash->{foos}=[$c->model('DB::foo')->all]; 

내 서식 파일에서 시도해 보았습니다. 다음

[% FOREACH foo IN foos -%] 
    <tr> 
     [%- IF int(foo.mybitField) %] 
       <td>The field is True</td> 
     [%- ELSE %] 
       <td>The field is False</td> 
     [% END %] 
    </tr> 
[% END -%] 

은 또한 단지

[%- IF foo.mybitField %] 

하지만 그 중 하나가 작동하지 않았다 시도했다. 데이터베이스 필드 유형 자체를 변경하는 것 외에 다른 방법은 없습니까?

+1

DBIx :: Class를 의미합니까? DBIx ::는 DBI 관련 확장 모듈에 사용되는 CPAN 네임 스페이스이므로 "DBIx 사용"에 대한 정보는 충분한 정보를 제공하지 않습니다. –

답변

4

방금 ​​테스트 한 결과 MySQL BIT 필드가 "원시"이진 값으로 예상대로 돌아 왔습니다. 템플릿 툴킷 문제가있는 것 같습니다.

난 당신이 무슨 뜻인지 모르겠어요

[%- IF int(foo.mybitField) %] 

를 나는 TT는 INT() 함수를 가지고 있다고 생각하지 않습니다. Perl의 int() 함수는 원하는 것을 수행하지 않습니다. 나의 제안은, 예를 들어, 일반 정수로 포장 된 값을 변환 펄에서 함수를 작성하는이 될 것입니다 :

my $int = unpack('c', $bit_field); 

대안이 스키마 클래스에 약간의 열 팽창 열을 추가 할 것입니다.

__PACKAGE__->inflate_column('mybitField', { 
    inflate => sub { unpack('c*', shift) }, 
}); 

그러나, 이것은 여전히 ​​아직 업데이트가 실패하고 그에 대한 간단한 솔루션을 모른다. MySQL에서 BIT 데이터 유형을 직접 사용하지 않았습니다. 일반적으로 CHAR (1) 열을 사용합니다.

[email protected]의 DBIC 메일 링리스트 또는 irc.perl.org의 # dbix-class 채널에 문의하시면 더 나은 답변을 얻을 수 있습니다.

관련 문제