3

DynamoDB テーブル内のすべてのアイテムを削除する単純な ruby​​ スクリプトを作成しようとしていますが、「delete_items」に渡す引数を理解するのに苦労しています。

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 または item.keys を渡そうとしましたが、どちらも機能しませんでした。

ありがとう!

4

2 に答える 2

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
于 2016-12-21T18:08:28.917 に答える
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
于 2017-02-17T18:31:54.860 に答える