1

Catalyst アプリで 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 %]

しかし、それもうまくいきませんでした。データベースのフィールド タイプ自体を変更する以外の方法はありますか?

4

1 に答える 1

4

これをテストしたところ、予想どおり、MySQL BIT フィールドが「生の」バイナリ値として返されます。したがって、あなたが抱えているのは Template Toolkit の問題のようです。

私はあなたが何を意味するのか分かりません:

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

TT には int() 関数がないと思います。そして、Perl の int() 関数も、あなたが望むことをしません。私の提案は、パックされた値を通常の整数に変換する関数をPerlで書くことです。たとえば、次のようになります。

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

別の方法として、スキーマ クラスに列インフレーション列を追加することもできます。

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

ただし、これはまだ更新に失敗するため、簡単な解決策はわかりません。私は MySQL で BIT データ型を自分で使用したことはありません。通常は CHAR(1) 列を使用します。

また、dbix-class@lists.scsys.co.uk の DBIC メーリング リストまたは irc.perl.org の #dbix-class チャネルで質問すると、より良い回答が得られる場合があります。

于 2009-11-04T00:19:30.083 に答える