python--boto3 之 与dynamoDB 的基本交互,表的备份与恢复

参考资料: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=1
        LastEvaluationTableName = ""
        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 table
            if response.has_key(‘LastEvaluatedTableName‘):
                LastEvaluationTableName = response["LastEvaluatedTableName"]
            else:
                break
            page += 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‘

未完待续.....

时间: 2024-11-08 23:25:02

python--boto3 之 与dynamoDB 的基本交互,表的备份与恢复的相关文章

简明Python教程笔记(二)----用户交互raw_input()

raw_input() python内建函数 将所有输入看做字符串,返回字符串类型 input()对待纯数字输入时具有自己的特性,它返回所输入的数字的类型( int, float ) input() 本质上还是使用 raw_input() 来实现的,只是调用完 raw_input() 之后再调用 eval() 函数 例子: #!/usr/bin/env pythonthis_year = 2014name = raw_input('please input your name:')age1 =

Python+Django+SAE系列教程11-----request/pose/get/表单

表单request,post,get 首先我们来看看Request对象,在这个对象中包含了一些有用的信息,学过B/S开发的人来说这并不陌生,我们来看看在Django中是如何实现的: 属性/方法 说明 举例 request.path 除域名以外的请求路径,以正斜杠开头 "/hello/" request.get_host() 主机名(比如,通常所说的域名) "127.0.0.1:8000" or"www.example.com" request.g

python's sixth day for me 员工信息表

import os user_dic = { 'username':None, 'password':None, 'login':True } flag = False name_list = ['id','name','age','phone','job'] check_conditions = ['>','<','=','like'] def auth(func): def wrapper(*args,**kwargs): with open('user-pwd',encoding='ut

如何使用 Python 对 Excel 做一份数据透视表

如何使用 Python 对 Excel 做一份数据透视表客户这边,其中有一张如同上图所示的数据汇总表,然而需求是,需要将这张表数据做一个数据透视表,最后通过数据透视表中的数据,填写至系统数据库.拿到需求,首先就想到肯定不能直接用设计器去操作 Excel,通过操作 Excel 去做数据透视表,那样,就得通过代码去完成了. 代码分享如下: import pandas as pdimport numpy as np def prvot():f = pd.read_excel(io='C:/file/t

Python 3 利用 subprocess 实现管道( pipe )交互操作读/写通信

这里我们用Windows下的shell来举例: from subprocess import * #因为是举例,就全部导入了 为了方便你理解,我们用一个很简单的一段代码来说明: 可以看见我们利用Popen实例化了一个p,创建了子程序cmd.exe,然后我们给他的的Stdin(标准输入流)Stdout(标准输出流); 同时使用了subprocess.PIPE 作为参数,这个是一个特殊值,用于表明这些通道要开放.(在Python3.5,加入了run()方法来进行更好的操作) 然后我们继续 这些信息是

使用Python boto3上传Windows EC2实例中的文件至S3存储桶中

一.创建终端节点 为什么要创建终端节点,把VPC和S3管理起来呢?如果不将VPC和S3通过终端节点管理起来,那么VPC中EC2实例访问S3存储桶是通过公共网络的:一旦关联起来,那么VPC中EC2实例访问S3存储桶走的就是内部网络.好处有两个:1. 走内部网络就不会产生流量费用:2. 走内部网络速度快,不会因为网络原因导致我们的Python脚本产生异常. VPC->终端节点->创建终端节点->将VPC和S3关联->关联子网 二.在Windows中安装Python3编译器以及boto3

Python 基础 - Day 1 Learning Note - 用户交互Interaction程序

用户输入及交互程序 - 格式化输出 方法1: 字符串的拼接 方法2: %s占位符 name = input("name:") age = int(input("age:")) #integer转成数字 job = input("job:") salary = input("salary:") info =''' -----------info of %s --------- name: %s age: %d job: %s s

Python学习笔记一:简单的交互程序

入门第一课:简单的用户交互程序 1 name = input("Name: ") #Python3.X中的input取代了Python2.X中的input_raw 2 age = int(input("Age: )) #此处若不加int语句,输入时计算机会识别为字符串,为了确保计算机识别为数字,用户也可以输入数字意外的字符.int = integer意为整数 3 job = input("Job: ") 4 salary = input("Sal

python boto3 support

boto3 client boto3.client() response client.describe_cases() (response) raise ClientError(parsed_response, operation_name) botocore.exceptions.ClientError: An error occurred (SubscriptionRequiredException) when calling the DescribeCases operation: AW