我正试图使用AWS Ruby SDK(v1)中Item
类的delete
方法删除AWS SimpleDB域中的一堆记录,例如
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中。我最初认为这可能是一个复制品问题,我检查得太早了。但不管我运行了多少次脚本,它都不会删除记录。
这是我正在使用的删除方法的文档。
我最终可以删除我想要的记录,但我不得不使用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卡住。我不接受这个答案,因为它不能解决我问题中的问题。