视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
在python下boto3与dynamoDB的基本交互和如何进行表的备份与恢复
2020-11-27 14:23:34 责编:小采
文档


参考资料: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'

未完待续.....

下载本文
显示全文
专题