2016-04-08 4 views
0

J'essaie de supprimer un groupe d'enregistrements dans un domaine AWS SimpleDB à l'aide de la méthode delete de la classe Item avec AWS Ruby SDK (v1), par ex.AWS SimpleDB Méthode de suppression du SDK Ruby v1 ne fonctionne pas

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}" 

Lorsque cela est fait, il signale que le nombre attendu d'enregistrements a été supprimé, mais ce n'est pas le cas. Ils sont tous encore là dans SimpleDB. J'ai d'abord pensé qu'il pourrait être un problème de réplique, que je vérifiais trop tôt. Mais peu importe combien de fois je lance le script, il ne supprime jamais les enregistrements.

Here's the docs pour la méthode de suppression que j'utilise.

Répondre

0

J'ai été en mesure de supprimer les enregistrements que je voulais à la fin, mais j'ai dû utiliser le v2 SDK à la place. Je l'ai fait quelque chose comme ceci:

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 

En outre, le client doit initialiser comme Aws::SimpleDB::Client.new au lieu de AWS::SimpleDB::Client.new.

Cela peut aider d'autres personnes, même si vous êtes bloqué avec le SDK v1. Je n'accepte pas cette réponse, car elle ne résout pas le problème dans ma question.