2012-05-24 2 views
4

Продолжение поддерживает тип boolean. В нем хранятся true и false как t и f в SQLite. Если перечитать данные преобразуются обратно в true и falseБулевы значения с SQLite и Sequel

SQLite сам предпочитает хранить true, как 1 и false, как 0 (и некоторые SQLite-administartion инструменты ожидают его). Если я храню логическое также как «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 -значения и 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) 

ответ

4

Вы можете использовать integer_booleans настройки использовать 1/0, как истина/ложь, а не 'т'/'F', см http://sequel.rubyforge.org/rdoc-adapters/classes/Sequel/SQLite/DatabaseMethods.html. Вот пример:

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

Отлично! Я просто протестировал на своем ПК 2nc без успеха, но там у меня было продолжение 3.28. После обновления он работает. Благодаря! – knut

Смежные вопросы