【问题标题】:Boolean values with SQLite and SequelSQLite 和 Sequel 的布尔值
【发布时间】:2012-05-30 21:47:48
【问题描述】:

Sequel 支持 boolean 类型。 它将truefalse 存储为tf 在SQLite 中。 如果再读一遍,数据会转换回truefalse

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

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-values 和 DB[:test].filter(:my_truth => false)检测0-values?

我不是在寻找像 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)

【问题讨论】:

    标签: ruby sqlite boolean sequel


    【解决方案1】:

    您可以使用 integer_booleans 设置来使用 1/0 作为真/假,而不是 't'/'f',请参阅 http://sequel.rubyforge.org/rdoc-adapters/classes/Sequel/SQLite/DatabaseMethods.html。这是一个例子:

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

    【讨论】:

    • 太棒了!我刚刚在我的 2nc PC 上进行了测试,但没有成功,但我有续集 3.28。升级后就可以了。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2013-12-28
    • 2011-11-11
    • 1970-01-01
    • 1970-01-01
    • 2016-10-11
    • 2012-10-24
    • 2016-07-04
    • 2010-10-25
    相关资源
    最近更新 更多