2017-02-27 12 views
8

मैं boto3 में एक नया उपयोगकर्ता हूं और मैं DynamoDB का उपयोग कर रहा हूं।डायनामो डीबी तालिका मौजूद है या नहीं, यह कैसे जांचें?

मैं डायनेमो डीबी एपीआई से गुज़र गया और मुझे कोई विधि नहीं मिली जो मुझे बताती है कि कोई तालिका पहले से मौजूद है या नहीं।

इस मुद्दे से निपटने का सबसे अच्छा तरीका क्या है?

क्या मुझे एक नई टेबल बनाने और कोशिश करने के लिए इसे लपेटने की कोशिश करनी चाहिए?

उत्तर

12

प्रलेखन पढ़ने से, मैं देख सकता हूं कि तीन विधियां हैं जिनके द्वारा आप जांच सकते हैं कि कोई तालिका मौजूद है या नहीं।

  1. CreateTable API तालिका पहले से मौजूद होने पर ResourceInUseException त्रुटि उत्पन्न करती है। इस
  2. को पकड़ने के अलावा प्रयास के साथ create_table विधि को लपेटें आप वर्तमान खाते और एंडपॉइंट से जुड़े तालिका नामों की सूची प्राप्त करने के लिए ListTables API का उपयोग कर सकते हैं। जांचें कि टेबल नाम आपके द्वारा प्रतिक्रिया में प्राप्त तालिका नामों की सूची में मौजूद है या नहीं।
  3. DescribeTable API यदि आपके द्वारा अनुरोधित तालिका नाम मौजूद नहीं है तो ResourceNotFoundException त्रुटि फेंक देगा।

मेरे लिए, पहला विकल्प बेहतर लगता है यदि आप केवल एक टेबल बनाना चाहते हैं।

संपादित करें: मुझे लगता है कि कुछ लोगों को अपवादों को पकड़ना मुश्किल हो रहा है। Boto3 में अपवादों को संभालने के तरीके के बारे में जानने के लिए मैं आपके लिए नीचे कुछ कोड डालूंगा।

उदाहरण 1

import boto3 

dynamodb_client = boto3.client('dynamodb') 

try: 
    response = dynamodb_client.create_table(
     AttributeDefinitions=[ 
      { 
       'AttributeName': 'Artist', 
       'AttributeType': 'S', 
      }, 
      { 
       'AttributeName': 'SongTitle', 
       'AttributeType': 'S', 
      }, 
     ], 
     KeySchema=[ 
      { 
       'AttributeName': 'Artist', 
       'KeyType': 'HASH', 
      }, 
      { 
       'AttributeName': 'SongTitle', 
       'KeyType': 'RANGE', 
      }, 
     ], 
     ProvisionedThroughput={ 
      'ReadCapacityUnits': 5, 
      'WriteCapacityUnits': 5, 
     }, 
     TableName='test', 
    ) 
except dynamodb_client.exceptions.ResourceInUseException: 
    # do something here as you require 
    pass 

उदाहरण 2

import boto3 

dynamodb_client = boto3.client('dynamodb') 


table_name = 'test' 
existing_tables = client.list_tables()['TableNames'] 
if table_name not in existing_tables: 
    response = dynamodb_client.create_table(
     AttributeDefinitions=[ 
      { 
       'AttributeName': 'Artist', 
       'AttributeType': 'S', 
      }, 
      { 
       'AttributeName': 'SongTitle', 
       'AttributeType': 'S', 
      }, 
     ], 
     KeySchema=[ 
      { 
       'AttributeName': 'Artist', 
       'KeyType': 'HASH', 
      }, 
      { 
       'AttributeName': 'SongTitle', 
       'KeyType': 'RANGE', 
      }, 
     ], 
     ProvisionedThroughput={ 
      'ReadCapacityUnits': 5, 
      'WriteCapacityUnits': 5, 
     }, 
     TableName=table_name, 
    ) 

उदाहरण 3

import boto3 

dynamodb_client = boto3.client('dynamodb') 

try: 
    response = dynamodb_client.describe_table(TableName='test') 
except dynamodb_client.exceptions.ResourceNotFoundException: 
    # do something here as you require 
    pass 
3

आप का उपयोग तालिका एपीआई का वर्णन कर सकते हैं यह निर्धारित करने के लिए कि तालिका मौजूद है या नहीं।

नमूना कोड:

from __future__ import print_function # Python 2/3 compatibility 
import os 
os.environ["TZ"] = "UTC" 
import boto3 

client = boto3.client('dynamodb', region_name='us-west-2', endpoint_url="http://localhost:8000") 



response = client.describe_table(
    TableName='Movies' 
)  

print(response) 

तालिका मौजूद है: -

  • आप मिल जाएगा प्रतिक्रिया

तालिका मौजूद नहीं होता है: -

  • आप मिल जाएगा ResourceNotFoundException

    botocore.errorfactory.ResourceNotFoundException: कोई त्रुटि (ResourceNotF oundException) जब DescribeTable आपरेशन बुला हुई: आपरेशन पर नहीं कर सकते किसी गैर-मौजूद तालिका

एक और तरीका: -

Waits until this Table is exists. This method calls DynamoDB.Waiter.table_exists.wait() which polls. DynamoDB.Client.describe_table() every 20 seconds until a successful state is reached. An error is returned after 25 failed checks.

table.wait_until_exists() 
+3

मुझे आपका कोड पसंद है लेकिन यह पता नहीं लगा सकता कि 'botocore.errorfactory.ResourceNotFoundException' को कैसे आयात किया जाए। मैं 'AttributeError:' मॉड्यूल 'ऑब्जेक्ट प्राप्त करता रहता हूं' ResourceNotFoundException'' कोई विशेषता नहीं है। मुझे 'boto3' और' botocore 'आयात किया गया है। – anon58192932

+0

@ anon58192932 क्या आपने यह पता लगाया कि अपवाद कैसे आयात करें? मुझे एक ही समस्या का सामना करना पड़ रहा है। – Phito

+1

@ फिटो देरी के लिए खेद है कि मैं अभी काम में वापस आ गया। कृपया मेरा जवाब देखें कि मैं अपवाद की जांच कैसे करूँगा इस पर पोस्ट कर रहा हूं। जहां तक ​​मैं समझता हूं इसे सीधे आयात नहीं किया जा सकता है। – anon58192932

7
import boto3 

from botocore.exceptions import ClientError 

TABLE_NAME = "myTableName" 
dynamodb = boto3.resource('dynamodb', endpoint_url="https://dynamodb.us-east-1.amazonaws.com") 

table = dynamodb.Table(TABLE_NAME) 

try: 
    response = client.describe_table(TableName=TABLE_NAME) 

except ClientError as ce: 
if ce.response['Error']['Code'] == 'ResourceNotFoundException': 
    print "Table " + TABLE_NAME + " does not exist. Create the table first and try again." 
else: 
    print "Unknown exception occurred while querying for the " + TABLE_NAME + " table. Printing full error:" 
    pprint.pprint(ce.response) 
+1

इसके लिए धन्यवाद! मैं अपने बालों से क्या बचा रहा था खो रहा था। – mmr

2

आप किसी भी boto3 टेबल इंस्टेंस ऑब्जेक्ट के .table_status एटीआर का उपयोग कर सकते हैं। यदि मौजूद है (क्रिएटिंग, अपडेटिंग, डिलीटिंग, एक्टिव) या अपवाद botocore.exceptions.ClientError: Requested resource not found: Table: <YOUR_TABLE_NAME> not found को फेंक देता है तो यह स्थिति की स्थिति देता है। आप वर्तमान स्थिति स्थिति पर पूरी जानकारी रखने के अलावा उन शर्तों को कोशिश/लपेट सकते हैं।

import boto3 
from botocore.exceptions import ClientError 

dynamodb = boto3.resource('dynamodb', region_name='us-west-2') 
table = dynamodb.Table('your_table_name_str') 

try: 
    is_table_existing = table.table_status in ("CREATING", "UPDATING", 
              "DELETING", "ACTIVE") 
except ClientError: 
    is_table_existing = False 
    print "Table %s doesn't exist." % table.name 
संबंधित मुद्दे