DynamoDB with python
In AWS CLI, S3 And Boto3 we have explained how to configure AWS Command Line Interface (CLI).
Amazon DynamoDB is a key-value and document NoSQL database.
Dynamodb can be managed through console, see https://aws.amazon.com/getting-started/hands-on/create-nosql-table/. But we will focus here how to use it with python.
Using CLI
We are following https://docs.aws.amazon.com/cli/latest/userguide/cli-services-dynamodb.html
Create table
aws dynamodb create-table \
--table-name Books \
--attribute-definitions AttributeName=Author,AttributeType=S AttributeName=Title,AttributeType=S \
--key-schema AttributeName=Author,KeyType=HASH AttributeName=Title,KeyType=RANGE \
--provisioned-throughput ReadCapacityUnits=1,WriteCapacityUnits=1
Insert
aws dynamodb put-item \
--table-name Books \
--item '{
"Author": {"S": "Olga Tokarczuk"},
"Title": {"S": "Dom dzinny, dom nocny"} ,
"Language": {"S": "Polish"}
}' \
--return-consumed-capacity TOTAL
Query
Create file expression-attributes.json
{
":v1": {"S": "Olga Tokarczuk"},
":v2": {"S": "Dom dzinny, dom nocny"}
}
Then query with:
aws dynamodb query --table-name Books \
--key-condition-expression "Author = :v1 AND Title = :v2" \
--expression-attribute-values file://expression-attributes.json
Testing dynamobd on local machine
See https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBLocal.html
Create directory ~/programs/dynamodb
export DYNAMODB_PATH=~/programs/dynamodb
mkdir -p $DYNAMODB_PATH
curl -sL --retry 3 \
"https://s3.eu-central-1.amazonaws.com/dynamodb-local-frankfurt/dynamodb_local_latest.tar.gz" \
| gunzip \
| tar -x -C $DYNAMODB_PATH
Then you can run it with
java -Djava.library.path=$DYNAMODB_PATH/DynamoDBLocal_lib \
-jar $DYNAMODB_PATH/DynamoDBLocal.jar -sharedDb
Then you can run the commands from the previous sections adding
--endpoint-url http://localhost:8000. So you can run
aws dynamodb create-table \
--table-name Books \
--attribute-definitions AttributeName=Author,AttributeType=S AttributeName=Title,AttributeType=S \
--key-schema AttributeName=Author,KeyType=HASH AttributeName=Title,KeyType=RANGE \
--provisioned-throughput ReadCapacityUnits=1,WriteCapacityUnits=1
--endpoint-url http://localhost:8000
List tables
aws dynamodb list-tables --endpoint-url http://localhost:8000
Quering with python
Create table
Create file create_table_books2.py
import boto3
dynamodb = boto3.resource('dynamodb', region_name='us-west-1', endpoint_url="http://localhost:8000")
table = dynamodb.create_table(
TableName='Books2',
KeySchema=[
{
'AttributeName': 'author',
'KeyType': 'HASH' #Partition key
},
{
'AttributeName': 'title',
'KeyType': 'RANGE' #Sort key
}
],
AttributeDefinitions=[
{
'AttributeName': 'author',
'AttributeType': 'S'
},
{
'AttributeName': 'title',
'AttributeType': 'S'
},
],
ProvisionedThroughput={
'ReadCapacityUnits': 10,
'WriteCapacityUnits': 10
}
)
print("Table status:", table.table_status)
Then you can run it:
python create_table_books2.py
Put and get data
Create file put_one_item.py with:
import boto3
dynamodb = boto3.resource('dynamodb', region_name='us-west-1', endpoint_url="http://localhost:8000")
table = dynamodb.Table('Books2')
response = table.put_item(
Item={
'author': 'Mariusz Szczygieł',
'title': "Nie ma"
}
)
print(response)
response = table.get_item(
Key={
'author': 'Mariusz Szczygieł',
'title': "Nie ma"
}
)
print(response)
Then run it with
python put_one_item.py
Load from json and quering
Create json file books2.json with:
[
{
"author": "Olga Tokarczuk",
"title": "Dom dzienny, dom nocny"
},
{
"author": "Anna Bikont",
"title": "Sendlerowa w ukryciu"
},
{
"author": "Mariusz Szczygieł",
"title": "Kaprysik"
}
]
And then load_books2.py
import json
import boto3
from boto3.dynamodb.conditions import Key
dynamodb = boto3.resource('dynamodb', region_name='us-west-1', endpoint_url="http://localhost:8000")
table = dynamodb.Table('Books2')
with open("books2.json") as json_file:
books = json.load(json_file)
for book in books:
author = book['author']
title = book['title']
print("Adding book:",author, title)
table.put_item(
Item={
'author': author,
'title': title
}
)
response = table.query(
KeyConditionExpression=Key('author').eq('Mariusz Szczygieł')
)
print(response)
More on queries: https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GettingStarted.Python.04.html
Delete table
You can delete the table with method table.delete.
PynamoDB
PynamoDB provides simple API for dynamobd.
Install
pip install pynamodb
Model
from pynamodb.models import Model
from pynamodb.attributes import UnicodeAttribute
class BookModel(Model):
"""
A DynamoDB User
"""
class Meta:
table_name = "books3"
host = "http://localhost:8000"
author = UnicodeAttribute(hash_key=True)
title = UnicodeAttribute(range_key=True)
Create table
BookModel.create_table(read_capacity_units=1, write_capacity_units=1)
Put
book = BookModel("Dorota Masłowska", "Inni ludzie")
book.save()
book = BookModel("Dorota Masłowska", "Wojna polsko-ruska pod flagą biało-czerwoną")
book.save()
Query
for book in BookModel.query("Dorota Masłowska"):
print(f"Author: {book.author}")
print(f"Title: {book.title}")
Backup the table
BookModel.dump(“bookmodel_backup.json”)
Restore the table
BookModel.load(“bookmodel_backup.json”)
Running on AWS using profiles
Solution from https://github.com/pynamodb/PynamoDB/issues/204
class BookModel(Model):
"""
A DynamoDB User
"""
class Meta:
table_name = "books3"
region = 'us-west-1'
author = UnicodeAttribute(hash_key=True)
title = UnicodeAttribute(range_key=True)
Updated: 2020-04-26