我在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文档中找到它,但也许我错过了一些东西。
提前致谢。
答案 0 :(得分: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
答案 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;
}