2016-04-08 64 views
0

我试图用AWS Ruby SDK(v1)例如Item类的delete方法删除AWS SimpleDB域中的一堆记录。AWS SimpleDB Ruby v1 SDK删除方法不起作用

expected_total = # fetched using a count(*) query 
actually_deleted = 0 

query = "select * from MyDomain where Attr = '#{attr_value}'" 
token = nil 
begin 
    if token == nil then 
     resp = sdb.select(select_expression: query) 
    else 
     resp = sdb.select(
     select_expression: query, 
     next_token: token) 
    end 
    token = resp[:next_token] 
    resp[:items].each do |item| 
     item.delete({}) 
     actually_deleted += 1 
     print "\rDeleted #{actually_deleted} records..." if actually_deleted % 250 == 0 
    end 
end while token != nil && token != '' 

puts "\nComplete. Expected: #{expected_total} Actual: {actually_deleted}" 

完成后,它报告预期的记录数已被删除,但它们没有。他们在SimpleDB中仍然存在。我最初认为这可能是一个复制问题,我过早检查。但是,我运行脚本的次数并不重要,它从不删除记录。

Here's the docs我正在使用的删除方法。

回答

0

我能够最终删除想要的记录,但我必须改用v2 SDK。我做了这样的事情:

item_batch = [] 
token = nil 
begin 
    if token == nil then 
     resp = sdb.select(select_expression: query) 
    else 
     resp = sdb.select(
     select_expression: query, 
     next_token: token) 
    end 
    token = resp[:next_token] 
    resp[:items].each do |item| 
     item_batch << { name: item[:name] } 
     if item_batch.size == 25 then 
     sdb.batch_delete_attributes({domain_name: domain_name, items: item_batch }) 
     item_batch = [] 
     actually_deleted += 25 
     end 
     print "\rDeleted #{actually_deleted} records..." if actually_deleted % 250 == 0 
    end 
end while token != nil && token != '' 

if not item_batch.empty? then 
    sdb.batch_delete_attributes({domain_name: domain_name, items: item_batch }) 
    actually_deleted += item_batch.size 
end 

此外,客户端需要像Aws::SimpleDB::Client.new,而不是AWS::SimpleDB::Client.new来初始化。

这可能会帮助其他人,尽管你可能会被困在v1 SDK中。我不接受这个答案,因为它不能解决我的问题。