ruby数据映射器可以';无法保存到数据库
我有一个这样的数据库模式ruby数据映射器可以';无法保存到数据库,ruby,database,Ruby,Database,我有一个这样的数据库模式 DataMapper.setup :default, "sqlite://#{Dir.pwd}/image.db" class Image include DataMapper::Resource property :id , Serial property :url , String,unique: true property :desc , String,unique: true,default: "empty"
DataMapper.setup :default, "sqlite://#{Dir.pwd}/image.db"
class Image
include DataMapper::Resource
property :id , Serial
property :url , String,unique: true
property :desc , String,unique: true,default: "empty"
end
DataMapper.finalize.auto_upgrade!
然后我有一个这样的循环
links.each do |link|
puts link
if Image.all(:url=>link).empty? == true
img=Image.create(:url => link)
puts "Cannot save to database "if img.saved? == false
end
end
我想在数据库中还没有链接时添加链接。我运行脚本时总是无法保存到dabase。我做错了什么?谢谢你的帮助。
编辑:我添加到我的代码中
DataMapper::Logger.new($stdout, :debug)
没有插入查询,只有选择 您得到“无法保存到数据库”是什么意思
您可以尝试类似的方法,看看是否效果更好:
links.each do |link|
if Image.first(:url => link)
p "image exists"
else
if Image.create(:url => link)
p "Image succesfully saved"
else
p "could not save image"
end
end
end
您将:desc属性声明为唯一,并将默认值设置为“empty”,在代码示例中,您创建图像时未指定:desc,这会导致唯一性验证失败,这就是图像未保存的原因。您可以从:desc属性声明中删除唯一选项,也可以确保在创建图像时为:desc提供唯一值 此外,要使代码更详细,以便看到任何验证错误,请尝试以下操作:
links.each do |link|
image = Image.new(:url => link)
if image.save
puts "Image saved"
else
puts "Failed to save image: #{image.errors.inspect}"
end
end
请注意,要使用验证错误,需要使用“dm validations”gem。当我的脚本完成时,数据库仍然为空。根据文件“如果创建成功,#create将返回新创建的DataMapper::Resource。如果失败,它将返回一个新资源,该资源使用给定的属性和为该资源声明的可能默认值初始化,但尚未保存。要了解创建是否成功,可以调用#saved?在返回的资源上。如果资源成功持久化,它将返回true,否则返回false。“这就是为什么我要检查保存?因为我的数据库仍然为空,您可以请求在出现错误时引发异常:
Image.raise\u on\u save\u failure=true