title: Python Amazon Dynamodb how to reliably delete a database using boto?
body: <p>The code below is intended to create a test database, but first delete it if it exists.</p>
  
  <p>First, the version information:</p>
  
  <pre><code>Python 2.7.4 (default, Apr 19 2013, 18:28:01) 
  [GCC 4.7.3] on linux2
  Type "help", "copyright", "credits" or "license" for more information.
  &gt;&gt;&gt; import boto
  &gt;&gt;&gt; print(boto.Version)
  2.19.0
  &gt;&gt;&gt; 
  </code></pre>
  
  <p>Running the code works the first time, but run it again immediately and it reports the following error:</p>
  
  <pre><code>ubuntu@mailapp.stat.com:~/stat/tools$ python js-dbd-test.py 
  DynamoDB table: emails
  {u'Table': {u'AttributeDefinitions': [{u'AttributeName': u'messageid', u'AttributeType': u'S'}], u'ProvisionedThroughput': {u'NumberOfDecreasesToday': 0, u'WriteCapacityUnits': 1, u'ReadCapacityUnits': 1}, u'TableSizeBytes': 153, u'TableName': u'emails', u'TableStatus': u'ACTIVE', u'KeySchema': [{u'KeyType': u'HASH', u'AttributeName': u'messageid'}], u'ItemCount': 1, u'CreationDateTime': 1366430267.719}}
  DynamoDB table: notes
  {u'Table': {u'ProvisionedThroughput': {u'NumberOfDecreasesToday': 0, u'WriteCapacityUnits': 1, u'ReadCapacityUnits': 1}, u'TableSizeBytes': 0, u'ItemCount': 0, u'TableName': u'notes', u'TableStatus': u'DELETING'}}
  DynamoDB table: users
  {u'Table': {u'AttributeDefinitions': [{u'AttributeName': u'submissionid', u'AttributeType': u'S'}, {u'AttributeName': u'userid', u'AttributeType': u'S'}], u'ProvisionedThroughput': {u'NumberOfDecreasesToday': 0, u'WriteCapacityUnits': 1, u'ReadCapacityUnits': 1}, u'TableSizeBytes': 0, u'TableName': u'users', u'TableStatus': u'ACTIVE', u'KeySchema': [{u'KeyType': u'HASH', u'AttributeName': u'submissionid'}, {u'KeyType': u'RANGE', u'AttributeName': u'userid'}], u'ItemCount': 0, u'CreationDateTime': 1386161175.525}}
  Deleting table....
  waiting....
  ACTIVE
  ACTIVE
  Traceback (most recent call last):
    File "js-dbd-test.py", line 53, in &lt;module&gt;
      notes.delete()
    File "/home/ubuntu/stat/local/lib/python2.7/site-packages/boto/dynamodb2/table.py", line 341, in delete
      self.connection.delete_table(self.table_name)
    File "/home/ubuntu/stat/local/lib/python2.7/site-packages/boto/dynamodb2/layer1.py", line 519, in delete_table
      body=json.dumps(params))
    File "/home/ubuntu/stat/local/lib/python2.7/site-packages/boto/dynamodb2/layer1.py", line 1487, in make_request
      retry_handler=self._retry_handler)
    File "/home/ubuntu/stat/local/lib/python2.7/site-packages/boto/connection.py", line 899, in _mexe
      status = retry_handler(response, i, next_sleep)
    File "/home/ubuntu/stat/local/lib/python2.7/site-packages/boto/dynamodb2/layer1.py", line 1530, in _retry_handler
      data)
  boto.exception.JSONResponseError: JSONResponseError: 400 Bad Request
  {u'message': u'Attempt to change a resource which is still in use: Table is being deleted: notes', u'__type': u'com.amazonaws.dynamodb.v20120810#ResourceInUseException'}
  (stat)[~/stat/tools]
  ubuntu@mailapp.stat.com:~/stat/tools$ 
  </code></pre>
  
  <p>Can anyone suggest what I am doing wrong and a way to reliably delete and recreate Dynamodb databases?</p>
  
  <pre><code>from boto.dynamodb2 import regions
  from boto.dynamodb2.fields import HashKey, RangeKey, KeysOnlyIndex
  from boto.dynamodb2.layer1 import DynamoDBConnection
  from boto.dynamodb2.table import Table
  from boto.dynamodb2.types import NUMBER, STRING
  import boto
  global config
  import ConfigParser
  import sys
  import uuid
  from time import sleep
  
  config = ConfigParser.ConfigParser()
  config.read('~/status.conf')
  
  connection=DynamoDBConnection(
      aws_access_key_id=config.get("statusapplication", "accesskeyid"),
      aws_secret_access_key=config.get("statusapplication", "secretaccesskey"),
      host='dynamodb.us-west-1.amazonaws.com',
      region='us-west-1',
  )
  
  #get and print list of tables
  tablenames = connection.list_tables().get('TableNames', None)
  for table in tablenames:
      print('DynamoDB table: %s' % table)
      print(connection.describe_table(table))
  
  
  # delete table if it exists
  if 'notes' in tablenames:
      print('Deleting table....')
      notes = Table('notes', connection=connection)
      tablestatus = ''
      # gotta wait for the table to be ACTIVE before we can delete it
      count = 0
      while tablestatus != 'ACTIVE':
          print('waiting....')
          sleep(2)
          tabledescription = connection.describe_table(table)
          tablestatus = tabledescription['Table']['TableStatus']
          print(tablestatus)
          if count == 5:
              print('Timeout waiting for table to become ACTIVE, exiting.')
              sys.exit(1)
          count += 1
      sleep(5)
      tablestatus = tabledescription['Table']['TableStatus']
      print(tablestatus)
      notes = None
      notes = Table('notes', connection=connection)
      notes.delete()
  
  
      # wait for the table delete to complete
      count = 0
      tabledescription = connection.describe_table(table)
      tablestatus = tabledescription['Table']['TableStatus']
      while tablestatus == 'DELETING':
          sleep(2)
          tabledescription = connection.describe_table(table)
          tablestatus = tabledescription['Table']['TableStatus']
          print(tablestatus)
          print(tabledescription)
          if count == 5:
              print('Table did not delete in under 10 seconds, exiting.')
              sys.exit(1)
          print('waiting....')
          count += 1
  
  
  
  # create table if it does not exist
  if 'notes' not in tablenames:
      print('Creating table....')
      notes = Table.create('notes', schema=[
          HashKey('noteid', data_type=STRING),
      ], throughput={
          'read': 1,
          'write': 1,
      }, connection=connection)
  
      # wait for the table creation to complete
      count = 0
      tablestatus = ''
      while tablestatus != 'ACTIVE':
          sleep(2)
          tabledescription = connection.describe_table(table)
          tablestatus = tabledescription['Table']['TableStatus']
          print(tablestatus)
          print(tabledescription)
          if count == 5:
              print('Table did not create in under 10 seconds, exiting.')
              sys.exit(1)
          print('waiting....')
          count += 1
  
  # get the table
  notes = Table('notes', connection=connection)
  
  sys.exit(0)
  </code></pre>