DBIx :: Class如何处理布尔值?

时间:2012-09-25 22:51:28

标签: perl orm perl-module dbix-class

我在perl脚本中使用DBIx :: Class与sqlite数据库进行交互。

在进行插入/搜索时,DBIx :: Class会将“true”和“false”视为什么?

例如:

$schema->resultset('SomeObject')->create({ some_boolean => 1, primary_key => 1 });

$schema->resultset('SomeObject')->search({ some_boolean => 'true' });

感谢任何帮助或文档(我无法在DBIx :: Class文档中找到它,但也许我错过了一些东西。

提前致谢。

4 个答案:

答案 0 :(得分:1)

DBIx::ClassDBIx::Class::InflateColumn::Boolean的帮助下处理布尔值:

加载此组件并将列声明为布尔值。

  package Table;
  __PACKAGE__->load_components(qw/InflateColumn::Boolean Core/);
  __PACKAGE__->table('table');
  __PACKAGE__->true_is('Y');
  __PACKAGE__->add_columns(
      foo => {
          data_type => 'varchar',
          is_boolean  => 1,
      },
      bar => {
          data_type => 'varchar',
          is_boolean  => 1,
          true_is     => qr/^(?:yes|ja|oui|si)$/i,
      },
      baz => {
          data_type => 'int',
          is_boolean  => 1,
          false_is    => ['0', '-1'],
      },
  );

然后您可以将指定的列视为布尔值:

  print 'table.foo is ', $table->foo ? 'true' : 'false', "\n";
  print 'table.bar is ', $table->bar ? 'true' : 'false', "\n";

布尔对象仍然字符串化为实际字段值:

  print $table->foo;  # prints "Y" if it is true

UPD 如何选择字段为真的行 由于DBIx::Class使用SQL::Abstract来搜索TRUE值的字段,因此您应该参考bool一元运算符:

my %where  = (
    -bool       => 'is_user',
    -not_bool   => 'is_enabled',
);

会给你:

WHERE is_user AND NOT is_enabled

答案 1 :(得分:0)

DBIx :: Class会以perl的方式处理true和false ... 0,'',undef,()和{}都是“false”,而其他任何东西都是“true”。

答案 2 :(得分:0)

http://sqlite.org/datatype3.html表示SQLite没有布尔数据类型,但false存储为整数0,true存储为整数1.

答案 3 :(得分:0)

由于人们发现这有用,我想我会把我写的get_bool()函数转换为将perl值转换为DBIx可接受的格式:

sub get_bool {
  my $self = shift;
  my $bool = shift;
  return undef if(!defined $bool || $bool =~ m/^null$/i);
  return 0 if($bool =~ m/^(fail|not_ok|error|0)/i || $bool =~ m/^\s*$/);
  return 1;
}