首頁  >  文章  >  後端開發  >  在python下boto3與dynamoDB 的基本互動和如何進行表的備份與恢復

在python下boto3與dynamoDB 的基本互動和如何進行表的備份與恢復

巴扎黑
巴扎黑原創
2017-07-22 11:27:412198瀏覽

參考資料:http://boto3.readthedocs.io/en/latest/reference/services/dynamodb.html

最近因工作需要,研究了一下boto3中dynamoDB部分,略有心得,在此總結一下。

首先是boto3的安裝,在裝有python和pip的機器上,運行

sudo pip install boto3

 

官網文檔裡,boto3提供的與dynamoDB互動的介面有以下幾種:

batch_get_item()
batch_write_item()
can_paginate()
create_table()
delete_item()
delete_table()
describe_limits()
describe_table()
describe_time_to_live()
generate_presigned_url()
get_item()
get_paginator()
get_waiter()
list_tables()
list_tags_of_resource()
put_item()
query()
scan()
tag_resource()
untag_resource()
update_item()
update_table()
update_time_to_live()

說白了,就是對錶和記錄的增、刪、查、改。本文主要描述我最近使用的那幾個介面。

 

要在python中使用boto3,就得先import boto3。當然,這是廢話。為了使用方便,我先寫了一個json格式的配置文件,如下:

{"region_name":"xxx","aws_access_key_id":"xxx","aws_secret_access_key":"xxx"}

 

#然後封裝了一個專門用於操作dynamoDB的類,目前什麼都沒有

class dynamodb_operation():

它需要一個讀取json檔案的方法:

    def load_json(self,path):try:
            with open(path) as json_file:
                data = json.load(json_file)except Exception as e:print 'ERROR: no such file like ' + path
            exit(-1)else:return data

由於讀進來的檔案可能不是json格式,我在這裡就是想讓他報個錯,然後退出。如果不想讓它退出,在except裡改改就好了。

然後,我希望這個類別有一個私有成員client,在我實例化物件的時候就建立好連接,於是,有了以下初始化方法:

    def __init__(self,path):
        conf = self.load_json(path)
        self.client = boto3.client('dynamodb',region_name=conf['region_name'],aws_access_key_id=conf['aws_access_key_id'], aws_secret_access_key=conf['aws_secret_access_key'])

與先前的設定檔是對應的。

有了這個基礎,就可以封裝自己想要使用的方法了。各方法的在官網上的說明就不照搬過來了。

1、列出dynamoDB中的所有的表

    def list_all_table(self):
        page=1LastEvaluationTableName = ""while True:if page == 1:
                response = self.client.list_tables()else:
                response = self.client.list_tables(
                        ExclusiveStartTableName=LastEvaluationTableName
                        )
            TableNames = response['TableNames']for table in TableNames:print tableif response.has_key('LastEvaluatedTableName'):
                LastEvaluationTableName = response["LastEvaluatedTableName"]else:breakpage += 1

list_table()方法一次最多只能取得100張表的表名,並且在每次返回的時候,key為"LastEvaluatedTableName"的值為最後一張表的表名,可以做為下次請求的時候的參數。這樣循環調用,即可取得所有的表名。如果後面沒有表了,response裡將不會有LastEvaluatedTableName。這裡我只是想把表名印到終端,如果想保存起來,也是可以的。

2、取得某張表格的資訊 describe_table()

    def get_table_desc_only(self,table):try:
            response = self.client.describe_table(TableName=table)except Exception as e:print 'ERROR: no such table like ' + table
            exit(-1)else:return response["Table"]

此處只是將response["Table"]原原本本機傳回,沒有做其它處理。

如果我想知道一張表的大小,可以:

    def get_table_size(self,table):
        response = self.get_table_desc_only(table)
        stastic = {}
        stastic['TableSizeBytes'] = response['TableSizeBytes']
        stastic['ItemCount'] = response['ItemCount']return stastic

#如果想知道其它訊息,而且是只想知道那些訊息的話,也可以寫出對應的方法。

3、建立一張表

    def create_table(self,tablename,keySchema,attributeDefinitions,provisionedThroughput):
        table = self.client.create_table(
                TableName=tablename,
                KeySchema=keySchema,
                AttributeDefinitions=attributeDefinitions,
                ProvisionedThroughput=provisionedThroughput
                )# Wait until the table exists.self.client.get_waiter('table_exists').wait(TableName=tablename)

        response = self.client.describe_table(TableName=tablename)print response

這是在建立一張沒有索引的表。創表需要時間,所以使用了get_waiter()方法。

4、插入資料

    def put_item(self,tableName,item):try:
            self.client.put_item(
                    TableName=tableName,
                    Item=item
                    )except Exception as e:print 'ERROR: put item fail. msg: ' + str(e)
            exit(-1)else:return

封裝的此方法需要傳入的是一個格式正確的json,並且key要與表格對應。例如:

{'uid':{'N':'999'},'aid':{'N':'999'},'sid':{'N':'999'},'ksid':{'N':'999'}}

5、刪表

    def delete_table(self,table):try:
            self.client.delete_table(
                    TableName=table
                    )   except Exception as e:print 'ERROR: delete table ' + table + ' fail. msg: ' + str(e)else:print 'delete table ' + table + ' succ'

 

未完待續.....

以上是在python下boto3與dynamoDB 的基本互動和如何進行表的備份與恢復的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn