どのように私はDBIxを使用してから、mysqlのビットを使用することができます

StackOverflow https://stackoverflow.com/questions/1665812

  •  13-09-2019
  •  | 
  •  

質問

私は自分の触媒アプリで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 %]

が、それはどちらか動作しませんでした。別にデータベースフィールドの型自体を変更することから、他の方法?

役に立ちましたか?

解決

私はこれをテストし、期待通りにMySQLのビットフィールドは、「生」のバイナリ値として戻ってきます。 だから、それはあなたが持っているものと思われるテンプレートツールキットの問題です。

私はあなたのことで何を意味するのか分かりません

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

私はTTがint()関数を持っているとは思いません。そして、PerlのINT()関数はどちらか、あなたがやりたいことではないでしょう。私の提案は、例えば、通常の整数にパックされた値を変換Perlでの関数を書くのいずれかになります:

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

の代替は、スキーマのクラスにいくつかの列インフレ列を追加します。

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

しかし、これはまだ、まだ更新のために失敗し、私はそのためのシンプルなのソリューションを知りません。私は、BITデータは、MySQL上で自分自身を入力し使ったことがない - 私は通常CHAR(1)のカラムを使用する

。 あなたがdbix-class@lists.scsys.co.ukで、またはirc.perl.org上の#dbixクラスのチャンネルでDBICメーリングリストで尋ねる場合は、

また、あなたはより良い答えを得る可能性があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top