5

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

在进行插入/搜索时,DBIx::Class 会考虑“真”和“假”吗?

例如:

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

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

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

提前致谢。

4

4 回答 4

1

DBIx::Class在DBIx::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
于 2016-12-14T16:52:03.337 回答
0

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

于 2012-09-25T23:16:31.047 回答
0

由于人们发现这很有帮助,我想我会加入我为将 perl 值转换为 DBIx 可接受的格式而编写的 get_bool() 函数:

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;
}
于 2014-05-08T15:46:35.363 回答
0

DBIx::Class 会像 perl 那样处理真假... 0、''、undef、() 和 {} 是“假”,而其他任何东西都是“真”。

于 2012-09-25T22:59:43.347 回答