2016-12-20 101 views
2

我正在尝试编写一个简单的ruby脚本来删除DynamoDB表中的所有项目,但我无法理解要将哪个参数传递给“delete_items”,这就是我到目前为止:使用Ruby删除DynamoDB表中的所有项目

dynamoDB = Aws::DynamoDB::Resource.new(region: 'us-west-2') 

dynamoDB.tables.each do |table| 
    puts "Table #{table.name}" 
    scan_output = table.scan({ 
    select: "ALL_ATTRIBUTES" 
    }) 

    scan_output.items.each do |item| 
    keys = item.keys 
    table.delete_item({ 
     key: ??? 
    }) 
    end 
end 

我试着通过项目,或item.keys - 都没有工作。

谢谢!

回答

1

最终我写这个剧本从所有表中删除所有记录(在大多数情况下不是很有用,但是对于我的这正是我所需要的东西,因为我用它在专用测试帐号):

#!/usr/bin/env ruby 

require 'aws-sdk' 

dynamoDB = Aws::DynamoDB::Resource.new(region: 'us-west-2') 

dynamoDB.tables.each do |table| 
    puts "Table #{table.name}" 
    scan_output = table.scan({ 
    select: "ALL_ATTRIBUTES" 
    }) 

    scan_output.items.each do |item| 
    item_key = Hash.new 
    table.key_schema.each do |k| 
     item_key[k.attribute_name] = item[k.attribute_name] 
    end 
    table.delete_item({ 
     key: item_key 
    }) 
    end 
end 
1

这是从DynamoDB表中扫描并删除所有项目的代码,但我不确定为什么不能删除表并重新创建是否要从表中删除所有项。

请注意,这是不是推荐的方法除非你有一些非常具体的用例。这会花费你代码从表中读取项目,然后删除项目。

代码: -

您可能需要在下面的代码更改表名和键值。在下面的代码中,使用的表名称是files,其关键值是fileName

如果你有分区键和排序键,那么你需要设置两个值。 files表只有分区键。

#! /usr/bin/ruby 

require "aws-sdk-core" 

# Configure SDK 

# use credentials file at .aws/credentials 
Aws.config[:credentials] = Aws::SharedCredentials.new 
Aws.config[:region] = "us-west-2" 

# point to DynamoDB Local, comment out this line to use real DynamoDB 
Aws.config[:dynamodb] = { endpoint: "http://localhost:8000" } 

dynamodb = Aws::DynamoDB::Client.new 

tableName = "files" 

scanParams = { 
    table_name: tableName 
} 

puts "Scanning files table." 

begin 
    loop do 
    result = dynamodb.scan(scanParams) 

    result.items.each{|files| 
     puts "Item :" + "#{files}" 
     puts "Going to delete item :" + "#{files["fileName"]}" 

     deleteParams = { 
     table_name: tableName, 
     key: { 
      fileName: files["fileName"] 

     } 
     } 
     begin 
     deleteResult = dynamodb.delete_item(deleteParams) 
     puts "Deleted item." + files["fileName"]    

     rescue Aws::DynamoDB::Errors::ServiceError => error 
     puts "Unable to delete item:" 
     puts "#{error.message}" 
     end 

    } 


    break if result.last_evaluated_key.nil? 
    puts "Scanning for more..." 
    scanParams[:exclusive_start_key] = result.last_evaluated_key 

    end 

rescue Aws::DynamoDB::Errors::ServiceError => error 
    puts "Unable to scan:" 
    puts "#{error.message}" 
end 
+0

你以为我知道表名,而我想删除所有表中的所有记录。我将发布我最终使用的脚本。 – duduamar

相关问题