我有以下代码:
require 'data_mapper'
class Dataset
include DataMapper::Resource
property :id, Serial
property :name, String, :required => true
property :year, String, :required => true
end
DataMapper.setup(:default, "sqlite://#{Dir.pwd}/database.db")
DataMapper.finalize.auto_upgrade!
Dataset.all(:year => nil).each do |dataset|
puts dataset.inspect
puts
end
我希望找到year
属性为空的所有行。但是当我运行这个脚本时,它会提供空输出。我运行它时:
Dataset.all(:year => "2005").each do |dataset|
puts dataset.inspect
puts
end
我得到了正确的输出:
#<Dataset @id=178 @name="Supernatural" @year="2005">
在sqlite shell上运行此查询为我提供了7行,其中包含空year
列:
sqlite> SELECT COUNT(`name`) FROM datasets WHERE `year` IS NULL;
COUNT(`name`)
-------------
7
我做错了什么?
答案 0 :(得分:1)
听起来问题的根源是移民不佳。 DataMapper认为没有NULL年的行,因为你告诉DataMapper不能有任何NULL年的行。
但是数据库仍然保留它们,因此绕过带有原始SQL的DatamMapper将产生它们。
解决方案是通过DataMapper(:required => false
)允许NULL,或修复数据库中的NULL(即UPDATE datasets SET year = '-1' WHERE year IS NULL
)