Ruby 带有SQLite和Sequel的布尔值

Ruby 带有SQLite和Sequel的布尔值,ruby,sqlite,boolean,sequel,Ruby,Sqlite,Boolean,Sequel,Sequel支持布尔类型。 它将true和false存储为SQLite中的t和f。 如果再次读取,数据将转换回true和false SQLite本身更喜欢将true存储为1,将false存储为0(一些SQLite管理工具也希望如此)。 如果我将布尔值也存储为“1”,Sequel还会将该值转换为“true”: require 'sequel' DB = Sequel.sqlite()#'test.db') DB.create_table(:test){ boolean :my_truth

Sequel支持
布尔类型。
它将
true
false
存储为SQLite中的
t
f
。 如果再次读取,数据将转换回
true
false

SQLite本身更喜欢将
true
存储为1,将
false
存储为0(一些SQLite管理工具也希望如此)。 如果我将布尔值也存储为“1”,Sequel还会将该值转换为“true”:

require 'sequel'
DB = Sequel.sqlite()#'test.db')
DB.create_table(:test){
  boolean :my_truth
  nvarchar :descr, :size => 10
}
DB[:test].insert(1, '1')
p DB[:test].filter(:descr => '1').first #-> {:my_truth=>true, :descr=>"1"}
但如果我选择了
true
,则找不到任何值:

DB[:test].filter(:my_truth => true).each{|ds|
  puts "\t%s" % ds[:descr]
}
true
“t”
可以找到:

DB[:test].insert(true, 'true')
DB[:test].insert('t', '"t"')
DB[:test].filter(:my_truth => true).each{|ds|
  puts "\t%s" % ds[:descr]    #true and 't'
}
对于类似于
0
的假值,也存在类似的情况。。。(参见问题后的示例代码)

所以我的问题是: 如何生成
DB[:test]。筛选(:my_truth=>true)
以检测
1
-值和
DB[:test]。筛选(:my_truth=>false)
以检测
0
-值

我不是在寻找类似于
DB[:test].filter(:my_truth=>[true,1])

Activerecord的类似问题

我使用Sequel 3.33.0


示例代码:

require 'sequel'
DB = Sequel.sqlite()#'test.db')
DB.create_table(:test){
  boolean :my_truth
  nvarchar :descr, :size => 10
  fixnum :line  #code line, where data is inserted
}

#All true:
DB[:test].insert(true, 'true', __LINE__)
DB[:test].insert('true', '"true"', __LINE__)
DB[:test].insert(1, 'one', __LINE__)
DB[:test].insert('t', 't', __LINE__)

#All false:
DB[:test].insert(false,'false', __LINE__)
DB[:test].insert('false','"false"', __LINE__)
DB[:test].insert(0,'zero', __LINE__)
DB[:test].insert('f', 'f', __LINE__)
DB[:test].insert('F', 'F', __LINE__)
DB[:test].insert(nil, 'nil', __LINE__)
DB[:test].insert('n', 'n', __LINE__)
DB[:test].insert('N', 'N', __LINE__)

#Also true
DB[:test].insert('x', 'x', __LINE__)
DB[:test].insert(' ', 'space', __LINE__)
DB[:test].insert('', 'empty', __LINE__)

puts "All true values:"
DB[:test].filter(:my_truth => true).each{|ds|
  puts "\t%s (line %i)" % [ds[:descr],  ds[:line] ]
}

puts "All false values:"
DB[:test].filter(:my_truth => false).each{|ds|
  puts "\t%s (line %i)" % [ds[:descr],  ds[:line] ]
}

puts "Data:"
DB[:test].each{|ds|
  puts "\t%-5s is <%s> (line %i)" % [ ds[:descr], ds[:my_truth].inspect, ds[:line] ]
}
需要“续集”
DB=Sequel.sqlite()#'test.DB')
DB.create_表(:test){
布尔:我的真理
nvarchar:descr,:size=>10
fixnum:行#代码行,插入数据的位置
}
#都是真的:
DB[:test].insert(true、'true'、\uuuuuuu行\uuuu)
DB[:test].insert('true','true','LINE'
DB[:test].插入(1,'一',_行_u)
DB[:test]。插入('t','t','u行uu)
#全错:
DB[:test].insert(false、'false'、\uuuuu行\uuuu)
DB[:test].insert('false','false','uuuuuu行uuu)
DB[:test].插入(0,'zero',_行_;)
DB[:test]。插入('f','f','uuuuu行\)
DB[:test]。插入('F','F','uuuuu行\)
DB[:test].insert(nil,'nil',\uuuuu行\uuuuu)
DB[:test].插入('n','n','uuuuuu行\uuuuu)
DB[:test].插入('N','N','uuuuuu行\uuuuu)
#同样正确
DB[:test]。插入('x','x','uuuuu行\uuuu)
DB[:test].insert(“”,'space',_行_)
DB[:test].insert(“”,'empty',_行__)
放置“所有真值:”
DB[:test].filter(:my_truth=>true)。每个{ds|
将“\t%s(第%i行)”放入%[ds[:descr],ds[:line]]
}
放置“所有假值:”
DB[:test].filter(:my_truth=>false)。每个{ds|
将“\t%s(第%i行)”放入%[ds[:descr],ds[:line]]
}
放入“数据”:
DB[:test]。每个{ds|
放置“\t%-5s是(第%i行)”%[ds[:descr],ds[:my_truth]。检查,ds[:line]]
}
结果:

All true values:
  true (line 10)
  t (line 13)
All false values:
  false (line 16)
  f (line 19)
Data:
  true  is <true> (line 10)
  "true" is <true> (line 11)
  one   is <true> (line 12)
  t     is <true> (line 13)
  false is <false> (line 16)
  "false" is <false> (line 17)
  zero  is <false> (line 18)
  f     is <false> (line 19)
  F     is <false> (line 20)
  nil   is <nil> (line 21)
  n     is <false> (line 22)
  N     is <false> (line 23)
  x     is <true> (line 26)
  space is <true> (line 27)
  empty is <true> (line 28)
所有真值:
正确(第10行)
t(第13行)
所有假值:
错误(第16行)
f(第19行)
数据:
true is(第10行)
“true”是(第11行)
一个是(第12行)
t is(第13行)
false is(第16行)
“假”是(第17行)
零是(第18行)
f is(第19行)
F is(第20行)
无is(第21行)
n is(第22行)
N is(第23行)
x是(第26行)
空格为(第27行)
空is(第28行)

您可以使用整数布尔设置将1/0用作真/假,而不是“t”/“f”,请参阅。下面是一个例子:

DB = Sequel.sqlite(:integer_booleans=>true)

伟大的我刚刚在我的2nc PC上测试了一下,但没有成功,但在那里我得到了续集3.28。升级后它可以工作。谢谢