如何使用DBIx使用mysql位

时间:2009-11-03 07:43:02

标签: mysql perl catalyst bit

我正在尝试访问我的催化剂应用程序中的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 个答案:

答案 0 :(得分:4)

我刚测试了这个,并且MySQL BIT字段作为“原始”二进制值返回,正如预期的那样。 所以看起来你有一个模板工具包问题。

我不知道你的意思:

[%- 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频道上询问,您可能会得到更好的答案。