Created
April 11, 2017 05:33
-
-
Save kusokamayarou/cebeee486b47a6b8406cc483829219e1 to your computer and use it in GitHub Desktop.
Amazon DynamoDB を Python から使ってみる ref: http://qiita.com/kusokamayarou/items/fc34447eb6970da1a103
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import boto3 | |
from boto3.session import Session | |
accesskey = "YOUR_ACCESSKEY" | |
secretkey = "YOUR_SECRETKEY" | |
region = "YOUR_REGION" | |
session = Session( | |
aws_access_key_id=accesskey, | |
aws_secret_access_key=secretkey, | |
region_name=region) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
# -*- coding: utf-8 -*- | |
# ---1----+----2----+----3----+----4----+----5----+----6----+----7----+----8---- | |
# ============================================================================== | |
# | |
# SampleDynamoDB.py | |
# | |
# * ex) $ ./SamplaDynamoDB.py | |
# | |
# ============================================================================== | |
import sys | |
import io | |
import logging | |
import json | |
import decimal | |
import time | |
import datetime | |
from datetime import datetime as dt | |
import boto3 | |
from boto3.session import Session | |
from boto3.dynamodb.conditions import Key, Attr | |
# Helper class to convert a DynamoDB item to JSON. | |
class DecimalEncoder(json.JSONEncoder): | |
def default(self, o): | |
if isinstance(o, decimal.Decimal): | |
if o % 1 > 0: | |
return float(o) | |
else: | |
return int(o) | |
return super(DecimalEncoder, self).default(o) | |
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') | |
logging.basicConfig(level=logging.INFO, filename=(__file__ + ".log"), format="%(asctime)s %(levelname)s %(filename)s %(lineno)d %(funcName)s | %(message)s") | |
# ------------------------------------------------------------------------------ | |
# Set | |
# ------------------------------------------------------------------------------ | |
tmp_today = datetime.datetime.today() | |
# AWS | |
accesskey = "[アクセスキー ID]" | |
secretkey = "[シークレットアクセスキー]" | |
region = "ap-northeast-1" | |
session = Session(aws_access_key_id=accesskey, aws_secret_access_key=secretkey, region_name=region) | |
dynamodb = session.resource('dynamodb') | |
# ------------------------------------------------------------------------------ | |
# 「ステップ 1: テーブルを作成する - Amazon DynamoDB」 | |
# <http://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/gettingstartedguide/GettingStarted.Python.01.html> | |
# ------------------------------------------------------------------------------ | |
def MoviesCreateTable(): | |
logging.info("<<<<<<<< %s Start >>>>>>>>", __name__) | |
try: | |
table = dynamodb.create_table( | |
TableName='Movies', | |
KeySchema=[ | |
{ | |
'AttributeName': 'year', | |
'KeyType': 'HASH' #Partition key | |
}, | |
{ | |
'AttributeName': 'title', | |
'KeyType': 'RANGE' #Sort key | |
} | |
], | |
AttributeDefinitions=[ | |
{ | |
'AttributeName': 'year', | |
'AttributeType': 'N' | |
}, | |
{ | |
'AttributeName': 'title', | |
'AttributeType': 'S' | |
}, | |
], | |
ProvisionedThroughput={ | |
'ReadCapacityUnits': 10, | |
'WriteCapacityUnits': 10 | |
} | |
) | |
logging.info("Table status : [%s]", table.table_status) | |
except Exception as e: | |
logging.error("Type : %s", type(e)) | |
logging.error(e) | |
logging.info("<<<<<<<< %s End >>>>>>>>", __name__) | |
# ------------------------------------------------------------------------------ | |
# 「ステップ 2: サンプルデータをロードする - Amazon DynamoDB」 | |
# <http://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/gettingstartedguide/GettingStarted.Python.02.html> | |
# ------------------------------------------------------------------------------ | |
def MoviesLoadData(): | |
logging.info("<<<<<<<< %s Start >>>>>>>>", __name__) | |
try: | |
with open("moviedata.json") as json_file: | |
movies = json.load(json_file, parse_float = decimal.Decimal) | |
for movie in movies: | |
year = int(movie['year']) | |
title = movie['title'] | |
info = movie['info'] | |
#logging.info("Adding Movie | Year:[%s], Title:[%s]", year, title) | |
table.put_item( | |
Item={ | |
'year': year, | |
'title': title, | |
'info': info, | |
} | |
) | |
except Exception as e: | |
logging.error("Type : %s", type(e)) | |
logging.error(e) | |
logging.info("<<<<<<<< %s End >>>>>>>>", __name__) | |
# ------------------------------------------------------------------------------ | |
# 「ステップ 3: 項目を作成、読み込み、更新、削除する - Amazon DynamoDB」 | |
# <http://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/gettingstartedguide/GettingStarted.Python.03.html> | |
# ------------------------------------------------------------------------------ | |
def MoviesItemOps01(): | |
logging.info("<<<<<<<< %s Start >>>>>>>>", __name__) | |
try: | |
table = dynamodb.Table('Movies') | |
title = "The Big New Movie" | |
year = 2015 | |
response = table.put_item( | |
Item={ | |
'year': year, | |
'title': title, | |
'info': { | |
'plot':"Nothing happens at all.", | |
'rating': decimal.Decimal(0) | |
} | |
} | |
) | |
logging.info("PutItem succeeded:") | |
logging.info(json.dumps(response, indent=4, cls=DecimalEncoder)) | |
except Exception as e: | |
logging.error("type : %s", type(e)) | |
logging.error(e) | |
logging.info("<<<<<<<< %s End >>>>>>>>", __name__) | |
def MoviesItemOps02(): | |
logging.info("<<<<<<<< %s Start >>>>>>>>", __name__) | |
try: | |
table = dynamodb.Table('Movies') | |
title = "The Big New Movie" | |
year = 2015 | |
try: | |
response = table.get_item( | |
Key={ | |
'year': year, | |
'title': title | |
} | |
) | |
except ClientError as e: | |
logging.info(e.response['Error']['Message']) | |
else: | |
item = response['Item'] | |
logging.info("GetItem succeeded:") | |
logging.info(json.dumps(item, indent=4, cls=DecimalEncoder)) | |
except Exception as e: | |
logging.error("type : %s", type(e)) | |
logging.error(e) | |
logging.info("<<<<<<<< %s End >>>>>>>>", __name__) | |
def MoviesItemOps03(): | |
logging.info("<<<<<<<< %s Start >>>>>>>>", __name__) | |
try: | |
table = dynamodb.Table('Movies') | |
title = "The Big New Movie" | |
year = 2015 | |
response = table.update_item( | |
Key={ | |
'year': year, | |
'title': title | |
}, | |
UpdateExpression="set info.rating = :r, info.plot=:p, info.actors=:a", | |
ExpressionAttributeValues={ | |
':r': decimal.Decimal(5.5), | |
':p': "Everything happens all at once.", | |
':a': ["Larry", "Moe", "Curly"] | |
}, | |
ReturnValues="UPDATED_NEW" | |
) | |
logging.info("UpdateItem succeeded:") | |
logging.info(json.dumps(response, indent=4, cls=DecimalEncoder)) | |
except Exception as e: | |
logging.error("type : %s", type(e)) | |
logging.error(e) | |
logging.info("<<<<<<<< %s End >>>>>>>>", __name__) | |
def MoviesItemOps04(): | |
logging.info("<<<<<<<< %s Start >>>>>>>>", __name__) | |
try: | |
table = dynamodb.Table('Movies') | |
title = "The Big New Movie" | |
year = 2015 | |
response = table.update_item( | |
Key={ | |
'year': year, | |
'title': title | |
}, | |
UpdateExpression="set info.rating = info.rating + :val", | |
ExpressionAttributeValues={ | |
':val': decimal.Decimal(1) | |
}, | |
ReturnValues="UPDATED_NEW" | |
) | |
logging.info("UpdateItem succeeded:") | |
logging.info(json.dumps(response, indent=4, cls=DecimalEncoder)) | |
except Exception as e: | |
logging.error("type : %s", type(e)) | |
logging.error(e) | |
logging.info("<<<<<<<< %s End >>>>>>>>", __name__) | |
def MoviesItemOps05(): | |
logging.info("<<<<<<<< %s Start >>>>>>>>", __name__) | |
try: | |
table = dynamodb.Table('Movies') | |
title = "The Big New Movie" | |
year = 2015 | |
logging.info("Attempting conditional update...") | |
try: | |
response = table.update_item( | |
Key={ | |
'year': year, | |
'title': title | |
}, | |
UpdateExpression="remove info.actors[0]", | |
ConditionExpression="size(info.actors) > :num", | |
ExpressionAttributeValues={ | |
':num': 2 | |
}, | |
ReturnValues="UPDATED_NEW" | |
) | |
except ClientError as e: | |
if e.response['Error']['Code'] == "ConditionalCheckFailedException": | |
logging.error(e.response['Error']['Message']) | |
else: | |
raise | |
else: | |
logging.info("UpdateItem succeeded:") | |
logging.info(json.dumps(response, indent=4, cls=DecimalEncoder)) | |
except Exception as e: | |
logging.error("type : %s", type(e)) | |
logging.error(e) | |
logging.info("<<<<<<<< %s End >>>>>>>>", __name__) | |
def MoviesItemOps06(): | |
logging.info("<<<<<<<< %s Start >>>>>>>>", __name__) | |
try: | |
table = dynamodb.Table('Movies') | |
title = "The Big New Movie" | |
year = 2015 | |
logging.info("Attempting a conditional delete...") | |
try: | |
response = table.delete_item( | |
Key={ | |
'year': year, | |
'title': title | |
}, | |
ConditionExpression="info.rating <= :val", | |
ExpressionAttributeValues= { | |
":val": decimal.Decimal(8) | |
} | |
) | |
except ClientError as e: | |
if e.response['Error']['Code'] == "ConditionalCheckFailedException": | |
logging.info(e.response['Error']['Message']) | |
else: | |
raise | |
else: | |
logging.info("DeleteItem succeeded:") | |
logging.info(json.dumps(response, indent=4, cls=DecimalEncoder)) | |
except Exception as e: | |
logging.error("type : %s", type(e)) | |
logging.error(e) | |
logging.info("<<<<<<<< %s End >>>>>>>>", __name__) | |
# ------------------------------------------------------------------------------ | |
# 「ステップ 4: データをクエリおよびスキャンする - Amazon DynamoDB」 | |
# <http://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/gettingstartedguide/GettingStarted.Python.04.html> | |
# ------------------------------------------------------------------------------ | |
def MoviesQuery01(): | |
logging.info("<<<<<<<< %s Start >>>>>>>>", __name__) | |
try: | |
table = dynamodb.Table('Movies') | |
logging.info("Movies from 1933") | |
response = table.query( | |
KeyConditionExpression=Key('year').eq(1933) | |
) | |
logging.info("Query01 succeeded:") | |
logging.info(json.dumps(response, indent=4, cls=DecimalEncoder)) | |
for i in response['Items']: | |
logging.info("%s : %s", i['year'], i['title']) | |
except Exception as e: | |
logging.error("Type : %s", type(e)) | |
logging.error(e) | |
logging.info("<<<<<<<< %s End >>>>>>>>", __name__) | |
def MoviesQuery02(): | |
logging.info("<<<<<<<< %s Start >>>>>>>>", __name__) | |
try: | |
table = dynamodb.Table('Movies') | |
logging.info("Movies from 1992 - titles A-L, with genres and lead actor") | |
response = table.query( | |
ProjectionExpression="#yr, title, info.genres, info.actors[0]", | |
ExpressionAttributeNames={ "#yr": "year" }, # Expression Attribute Names for Projection Expression only. | |
KeyConditionExpression=Key('year').eq(1992) & Key('title').between('A', 'L') | |
) | |
logging.info("Query02 succeeded:") | |
logging.info(json.dumps(response, indent=4, cls=DecimalEncoder)) | |
for i in response[u'Items']: | |
logging.info(json.dumps(i, cls=DecimalEncoder)) | |
except Exception as e: | |
logging.error("Type : %s", type(e)) | |
logging.error(e) | |
logging.info("<<<<<<<< %s End >>>>>>>>", __name__) | |
# ------------------------------------------------------------------------------ | |
# 「ステップ 5: (オプション) テーブルを削除する - Amazon DynamoDB」 | |
# <http://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/gettingstartedguide/GettingStarted.Python.05.html> | |
# ------------------------------------------------------------------------------ | |
def MoviesDeleteTable(): | |
logging.info("<<<<<<<< %s Start >>>>>>>>", __name__) | |
try: | |
table = dynamodb.Table('Movies') | |
table.delete() | |
except Exception as e: | |
logging.error("Type : %s", type(e)) | |
logging.error(e) | |
logging.info("<<<<<<<< %s End >>>>>>>>", __name__) | |
# ------------------------------------------------------------------------------ | |
# Main | |
# ------------------------------------------------------------------------------ | |
if __name__ == '__main__': | |
logging.info("<<<<<<<< %s Start >>>>>>>>", __name__) | |
# Set | |
logging.info("REGION : [%s]", region) | |
# Args | |
logging.info("Argc : [%d]", len(sys.argv)) | |
for i in range(len(sys.argv)): | |
logging.info("Argv[%d] : [%s]", i, sys.argv[i]) | |
# Check Table | |
table = dynamodb.Table('Movies') | |
logging.info("Table :") | |
logging.info(table) | |
# Create Table | |
#MoviesCreateTable() | |
#time.sleep(9) | |
# Load Json Data | |
#MoviesLoadData() | |
# Query Data | |
MoviesItemOps01() | |
MoviesItemOps02() | |
MoviesItemOps03() | |
MoviesItemOps04() | |
#MoviesItemOps05() | |
#MoviesItemOps06() | |
# Query Data | |
MoviesQuery01() | |
MoviesQuery02() | |
# Delete Table | |
#MoviesDeleteTable() | |
logging.info("<<<<<<<< %s End >>>>>>>>", __name__) | |
# ---1----+----2----+----3----+----4----+----5----+----6----+----7----+----8---- |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment