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