加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby – 使用SQLite和Sequel的布尔值

发布时间:2020-12-17 02:32:00 所属栏目:百科 来源:网络整理
导读:续集支持布尔类型. 它在SQLite中将true和false存储为t和f. 如果再次读取,数据将转换回true和false SQLite本身更喜欢将true存储为1,将false存储为0(并且一些SQLite-administartion工具期望它). 如果我将我的布尔值也存储为’1′,Sequel还会将值转换为’true’
续集支持布尔类型.
它在SQLite中将true和false存储为t和f.
如果再次读取,数据将转换回true和false

SQLite本身更喜欢将true存储为1,将false存储为0(并且一些SQLite-administartion工具期望它).
如果我将我的布尔值也存储为’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] .filter(:my_truth => true)检测1值和
DB [:test] .filter(:my_truth => false)检测0值?

我不是在寻找像DB [:test] .filter(:my_truth => [true,1])这样的东西

类似的问题Activerecord
Rails 3 SQLite3 Boolean false

我使用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] ]
}

结果:

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)

解决方法

您可以使用integer_booleans设置将1/0用作true / false,而不是’t’/’f’,请参阅 http://sequel.rubyforge.org/rdoc-adapters/classes/Sequel/SQLite/DatabaseMethods.html.以下是一个示例:

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读