%global _empty_manifest_terminate_build 0
Name: python-LucidDynamodb
Version: 1.0.128
Release: 1
Summary: A simple Python wrapper to AWS Dynamodb
License: MIT
URL: https://github.com/dineshsonachalam/Lucid-Dynamodb
Source0: https://mirrors.nju.edu.cn/pypi/web/packages/6b/bf/55b8ebf5d8737113426dd0dfb4fd1d019d304a76a0fc78109fae9bf92b28/LucidDynamodb-1.0.128.tar.gz
BuildArch: noarch
Requires: python3-boto3
Requires: python3-botocore
%description
A minimalistic wrapper to AWS DynamoDB
Useful links:
- See the full documentation at https://lucid-dynamodb.dineshsonachalam.com
- Ask questions in the GitHub issues
## Table of contents
- [Installation](#installation)
- [Example](#example)
- [Connect to DynamodDB](#connect-to-dynamodb)
- [Create a new table](#create-a-new-table)
- [Get all table names](#get-all-table-names)
- [Create a New Item](#create-a-new-item)
- [Read an Item](#read-an-item)
- [Read items by filter](#read-items-by-filter)
- [Update existing attribute in an item](#update-existing-attribute-in-an-item)
- [Add a new attribute in an item](#add-a-new-attribute-in-an-item)
- [Add an attribute to the list](#add-an-attribute-to-the-list)
- [Add an attribute to the string set](#add-an-attribute-to-the-string-set)
- [Increase an existing attribute value](#increase-an-existing-attribute-value)
- [Delete an attribute from an item](#delete-an-attribute-from-an-item)
- [Delete an attribute from the string set](#delete-an-attribute-from-the-string-set)
- [Delete an item](#delete-an-item)
- [Delete a table](#delete-a-table)
- [Running tests](#running-tests)
- [Github Workflow Artifacts](#github-workflow-artifacts)
- [License](#license)
## Installation
```console
pip install LucidDynamodb
```
**Note:** Prerequisite for Python3 development
## Example
#### Connect to DynamoDB
You can connect to DynamoDB by following any of these two ways.
1. Using AWS config
```py
from LucidDynamodb import DynamoDb
db = DynamoDb()
"""
$ pip install awscli #can add user flag
$ aws configure
AWS Access Key ID [****************ABCD]:[enter your key here]
AWS Secret Access Key [****************xyz]:[enter your secret key here]
Default region name [us-west-2]:[enter your region here]
Default output format [None]:
"""
```
2. Using AWS secret key
```py
from LucidDynamodb import DynamoDb
import os
AWS_ACCESS_KEY_ID = os.getenv("AWS_ACCESS_KEY_ID")
AWS_SECRET_ACCESS_KEY = os.getenv("AWS_SECRET_ACCESS_KEY")
db = DynamoDb(region_name="us-east-1",
aws_access_key_id=AWS_ACCESS_KEY_ID,
aws_secret_access_key=AWS_SECRET_ACCESS_KEY)
```
#### Create a new table
```py
from LucidDynamodb import DynamoDb
from LucidDynamodb.exceptions import (
TableAlreadyExists
)
import logging
logging.basicConfig(level=logging.INFO)
table_schema = {
"TableName": "dev_jobs",
"KeySchema": [{
"AttributeName": "company_name",
"KeyType": "HASH"
},
{
"AttributeName": "role_id",
"KeyType": "RANGE"
}
],
"AttributeDefinitions": [{
"AttributeName": "company_name",
"AttributeType": "S"
},
{
"AttributeName": "role_id",
"AttributeType": "S"
}
],
"GlobalSecondaryIndexes": [],
"ProvisionedThroughput": {
"ReadCapacityUnits": 1,
"WriteCapacityUnits": 1
}
}
if __name__ == "__main__":
try:
db = DynamoDb()
db.create_table(
table_name=table_schema.get("TableName"),
key_schema=table_schema.get("KeySchema"),
attribute_definitions=table_schema.get("AttributeDefinitions"),
global_secondary_indexes=table_schema.get("GlobalSecondaryIndexes"),
provisioned_throughput=table_schema.get("ProvisionedThroughput")
)
logging.info(f"{table_schema.get('TableName')} table created successfully")
except TableAlreadyExists as e:
logging.error(f"{table_schema.get('TableName')} table creation failed - {e}")
"""
dineshsonachalam@macbook examples % python 1-create-a-new-table.py
INFO:botocore.credentials:Found credentials in environment variables.
INFO:root:dev_jobs table created successfully
"""
```
#### Get all table names
```py
from LucidDynamodb import DynamoDb
from LucidDynamodb.exceptions import (
UnexpectedError
)
import logging
logging.basicConfig(level=logging.INFO)
if __name__ == "__main__":
try:
db = DynamoDb()
table_names = db.read_all_table_names()
logging.info(f"Table names: {table_names}")
except UnexpectedError as e:
logging.error(f"Read all table names failed - {e}")
"""
dineshsonachalam@macbook examples % python 2-get-all-table-names.py
INFO:botocore.credentials:Found credentials in environment variables.
INFO:root:Table names: ['CertMagic', 'dev_jobs', 'dev_test', 'kp-config-v1', 'test-1']
"""
```
#### Create a new item
```py
from LucidDynamodb import DynamoDb
from LucidDynamodb.exceptions import (
UnexpectedError
)
import logging
logging.basicConfig(level=logging.INFO)
if __name__ == "__main__":
try:
db = DynamoDb()
db.create_item(
table_name="dev_jobs",
item={
"company_name": "Google",
"role_id": "111",
"role": "Software Engineer 1",
"salary": "$1,50,531",
"locations": ["Mountain View, California", "Austin, Texas", "Chicago, IL"],
"yearly_hike_percent": 8,
"benefits": set(["Internet, Medical, Edu reimbursements",
"Health insurance",
"Travel reimbursements"
]),
"overall_review":{
"overall_rating" : "4/5",
"compensation_and_benefits": "3.9/5"
}
}
)
logging.info("Item created successfully")
except UnexpectedError as e:
logging.error(f"Item creation failed - {e}")
"""
dineshsonachalam@macbook examples % python 3-create-a-new-item.py
INFO:botocore.credentials:Found credentials in environment variables.
INFO:root:Item created successfully
"""
```
#### Read an item
```py
from LucidDynamodb import DynamoDb
from LucidDynamodb.exceptions import (
ItemNotFound
)
import logging
logging.basicConfig(level=logging.INFO)
if __name__ == "__main__":
try:
db = DynamoDb()
item = db.read_item(
table_name="dev_jobs",
key={
"company_name": "Google",
"role_id": "111"
}
)
logging.info(f"Item: {item}")
except ItemNotFound as e:
logging.error(f"Item doesn't exist - {e}")
"""
dineshsonachalam@macbook examples % python 4-read-an-item.py
INFO:botocore.credentials:Found credentials in environment variables.
INFO:root:Item: {
'locations': ['Mountain View, California', 'Austin, Texas', 'Chicago, IL'],
'role_id': '111',
'overall_review': {
'compensation_and_benefits': '3.9/5',
'overall_rating': '4/5'
},
'company_name': 'Google',
'role': 'Software Engineer 1',
'yearly_hike_percent': Decimal('8'),
'salary': '$1,50,531',
'benefits': {
'Travel reimbursements',
'Internet, Medical, Edu reimbursements',
'Health insurance'
}
}
"""
```
#### Read items by filter
```py
from LucidDynamodb import DynamoDb
from LucidDynamodb.exceptions import (
QueryFilterValidationFailed
)
import logging
from boto3.dynamodb.conditions import Key
logging.basicConfig(level=logging.INFO)
if __name__ == "__main__":
try:
db = DynamoDb()
db.create_item(
table_name="dev_jobs",
item={
"company_name": "Google",
"role_id": "112",
"role": "Software Architect",
"salary": "$4,80,000",
"locations": ["Mountain View, California"],
"yearly_hike_percent": 13,
"benefits": set(["Internet reimbursements"]),
"overall_review":{
"overall_rating" : "3/5",
"compensation_and_benefits": "4.2/5"
}
}
)
logging.info("Item created successfully")
items = db.read_items_by_filter(
table_name='dev_jobs',
key_condition_expression=Key("company_name").eq("Google")
)
logging.info(f"Items: {items}")
except QueryFilterValidationFailed as e:
logging.error(f"Items doesn't exist - {e}")
"""
dineshsonachalam@macbook examples % python 5-read-items-by-filter.py
INFO:botocore.credentials:Found credentials in environment variables.
INFO:root:Item created successfully
INFO:root:Items: [{
'locations': ['Mountain View, California', 'Austin, Texas', 'Chicago, IL'],
'role_id': '111',
'overall_review': {
'compensation_and_benefits': '3.9/5',
'overall_rating': '4/5'
},
'company_name': 'Google',
'role': 'Software Engineer 1',
'yearly_hike_percent': Decimal('8'),
'salary': '$1,50,531',
'benefits': {
'Internet, Medical, Edu reimbursements',
'Travel reimbursements',
'Health insurance'
}
}, {
'locations': ['Mountain View, California'],
'role_id': '112',
'overall_review': {
'compensation_and_benefits': '4.2/5',
'overall_rating': '3/5'
},
'company_name': 'Google',
'role': 'Software Architect',
'yearly_hike_percent': Decimal('13'),
'salary': '$4,80,000',
'benefits': {
'Internet reimbursements'
}
}]
"""
```
#### Update existing attribute in an item
```py
from LucidDynamodb import DynamoDb
from LucidDynamodb.exceptions import (
UnexpectedError
)
import logging
logging.basicConfig(level=logging.INFO)
if __name__ == "__main__":
try:
db = DynamoDb()
db.update_item(
table_name="dev_jobs",
key={
"company_name": "Google",
"role_id": "111"
},
attributes_to_update={
'role': 'Staff Software Engineer 2'
}
)
logging.info("Update is successful")
item = db.read_item(
table_name="dev_jobs",
key={
"company_name": "Google",
"role_id": "111"
}
)
logging.info(f"Item: {item}")
except UnexpectedError as e:
logging.error(f"Update failed - {e}")
"""
dineshsonachalam@macbook examples % python 6-update-existing-attribute-in-an-item.py
INFO:botocore.credentials:Found credentials in environment variables.
INFO:root:Update is successful
INFO:root:Item: {
'locations': ['Mountain View, California', 'Austin, Texas', 'Chicago, IL'],
'role_id': '111',
'overall_review': {
'compensation_and_benefits': '3.9/5',
'overall_rating': '4/5'
},
'company_name': 'Google',
'role': 'Staff Software Engineer 2',
'yearly_hike_percent': Decimal('8'),
'salary': '$1,50,531',
'benefits': {
'Health insurance',
'Internet, Medical, Edu reimbursements',
'Travel reimbursements'
}
}
"""
```
#### Add a new attribute in an item
```py
from LucidDynamodb import DynamoDb
from LucidDynamodb.exceptions import (
UnexpectedError
)
import logging
logging.basicConfig(level=logging.INFO)
if __name__ == "__main__":
try:
db = DynamoDb()
db.update_item(
table_name="dev_jobs",
key={
"company_name": "Google",
"role_id": "111"
},
attributes_to_update={
'overall_review.yearly_bonus_percent': 12
}
)
logging.info("Update is successful")
item = db.read_item(
table_name="dev_jobs",
key={
"company_name": "Google",
"role_id": "111"
}
)
logging.info(f"Item: {item}")
except UnexpectedError as e:
logging.error(f"Update failed - {e}")
"""
dineshsonachalam@macbook examples % python 7-add-a-new-attribute-in-an-item.py
INFO:botocore.credentials:Found credentials in environment variables.
INFO:root:Update is successful
INFO:root:Item: {
'locations': ['Mountain View, California', 'Austin, Texas', 'Chicago, IL'],
'role_id': '111',
'overall_review': {
'compensation_and_benefits': '3.9/5',
'overall_rating': '4/5',
'yearly_bonus_percent': Decimal('12')
},
'company_name': 'Google',
'role': 'Staff Software Engineer 2',
'yearly_hike_percent': Decimal('8'),
'salary': '$1,50,531',
'benefits': {
'Travel reimbursements',
'Internet, Medical, Edu reimbursements',
'Health insurance'
}
}
"""
```
#### Add an attribute to the list
```py
from LucidDynamodb import DynamoDb
from LucidDynamodb.exceptions import (
UnexpectedError
)
import logging
logging.basicConfig(level=logging.INFO)
if __name__ == "__main__":
try:
db = DynamoDb()
db.update_item(
table_name="dev_jobs",
key={
"company_name": "Google",
"role_id": "111"
},
attributes_to_update={
'locations': "Detroit, Michigan"
},
operation="ADD_ATTRIBUTE_TO_LIST"
)
logging.info("Update is successful")
item = db.read_item(
table_name="dev_jobs",
key={
"company_name": "Google",
"role_id": "111"
}
)
logging.info(f"Item: {item}")
except UnexpectedError as e:
logging.error(f"Update failed - {e}")
"""
dineshsonachalam@macbook examples % python 8-add-an-attribute-to-the-list.py
INFO:botocore.credentials:Found credentials in environment variables.
INFO:root:Update is successful
INFO:root:Item: {
'locations': ['Mountain View, California', 'Austin, Texas', 'Chicago, IL', 'Detroit, Michigan'],
'role_id': '111',
'overall_review': {
'compensation_and_benefits': '3.9/5',
'overall_rating': '4/5',
'yearly_bonus_percent': Decimal('12')
},
'company_name': 'Google',
'role': 'Staff Software Engineer 2',
'yearly_hike_percent': Decimal('8'),
'salary': '$1,50,531',
'benefits': {
'Health insurance',
'Travel reimbursements',
'Internet, Medical, Edu reimbursements'
}
}
"""
```
#### Add an attribute to the string set
```py
from LucidDynamodb import DynamoDb
from LucidDynamodb.exceptions import (
UnexpectedError
)
import logging
logging.basicConfig(level=logging.INFO)
if __name__ == "__main__":
try:
db = DynamoDb()
db.update_item(
table_name="dev_jobs",
key={
"company_name": "Google",
"role_id": "111"
},
attributes_to_update={
'benefits': "Free Food"
},
operation="ADD_ATTRIBUTE_TO_STRING_SET"
)
logging.info("Update is successful")
item = db.read_item(
table_name="dev_jobs",
key={
"company_name": "Google",
"role_id": "111"
}
)
logging.info(f"Item: {item}")
except UnexpectedError as e:
logging.error(f"Update failed - {e}")
"""
dineshsonachalam@macbook examples % python 9-add-an-attribute-to-the-string-set.py
INFO:botocore.credentials:Found credentials in environment variables.
INFO:root:Update is successful
INFO:root:Item: {
'locations': ['Mountain View, California', 'Austin, Texas', 'Chicago, IL', 'Detroit, Michigan'],
'role_id': '111',
'overall_review': {
'compensation_and_benefits': '3.9/5',
'overall_rating': '4/5',
'yearly_bonus_percent': Decimal('12')
},
'company_name': 'Google',
'role': 'Staff Software Engineer 2',
'yearly_hike_percent': Decimal('8'),
'salary': '$1,50,531',
'benefits': {
'Travel reimbursements',
'Free Food',
'Health insurance',
'Internet, Medical, Edu reimbursements'
}
}
"""
```
#### Increase an existing attribute value
```py
from LucidDynamodb import DynamoDb
from LucidDynamodb.exceptions import (
UnexpectedError
)
import logging
logging.basicConfig(level=logging.INFO)
if __name__ == "__main__":
try:
db = DynamoDb()
db.increase_attribute_value(
table_name='dev_jobs',
key={
"company_name": "Google",
"role_id": "111"
},
attribute_name="yearly_hike_percent",
increment_value=5
)
logging.info("Attribute value increment completed")
item = db.read_item(
table_name='dev_jobs',
key={
"company_name": "Google",
"role_id": "111"
}
)
logging.info(f"Item: {item}")
except UnexpectedError as e:
logging.error(f"Attribute value increment failed - {e}")
"""
dineshsonachalam@macbook examples % python 10-increase-an-existing-attribute-value.py
INFO:botocore.credentials:Found credentials in environment variables.
INFO:root:Attribute value increment completed
INFO:root:Item: {
'locations': ['Mountain View, California', 'Austin, Texas', 'Chicago, IL', 'Detroit, Michigan'],
'role_id': '111',
'overall_review': {
'compensation_and_benefits': '3.9/5',
'overall_rating': '4/5',
'yearly_bonus_percent': Decimal('12')
},
'company_name': 'Google',
'role': 'Staff Software Engineer 2',
'yearly_hike_percent': Decimal('13'),
'salary': '$1,50,531',
'benefits': {
'Internet, Medical, Edu reimbursements',
'Free Food',
'Health insurance',
'Travel reimbursements'
}
}
"""
```
#### Delete an attribute from an item
```py
from LucidDynamodb import DynamoDb
from LucidDynamodb.exceptions import (
UnexpectedError
)
import logging
logging.basicConfig(level=logging.INFO)
if __name__ == "__main__":
try:
db = DynamoDb()
db.delete_attribute(
table_name="dev_jobs",
key={"company_name": "Google", "role_id": "111"},
attribute_name="yearly_hike_percent")
logging.info("The attribute is deleted successfully")
item = db.read_item(
table_name="dev_jobs",
key={
"company_name": "Google",
"role_id": "111"
}
)
logging.info(f"Item: {item}")
except UnexpectedError as e:
logging.error(f"The attribute delete operation failed - {e}")
"""
dineshsonachalam@macbook examples % python 11-delete-an-attribute-from-an-item.py
INFO:botocore.credentials:Found credentials in environment variables.
INFO:root:The attribute is deleted successfully
INFO:root:Item: {
'locations': ['Mountain View, California', 'Austin, Texas', 'Chicago, IL', 'Detroit, Michigan'],
'role_id': '111',
'overall_review': {
'compensation_and_benefits': '3.9/5',
'overall_rating': '4/5',
'yearly_bonus_percent': Decimal('12')
},
'company_name': 'Google',
'role': 'Staff Software Engineer 2',
'salary': '$1,50,531',
'benefits': {
'Travel reimbursements',
'Free Food',
'Health insurance',
'Internet, Medical, Edu reimbursements'
}
}
"""
```
#### Delete an attribute from the string set
```py
from LucidDynamodb import DynamoDb
from LucidDynamodb.exceptions import (
UnexpectedError
)
import logging
logging.basicConfig(level=logging.INFO)
if __name__ == "__main__":
try:
db = DynamoDb()
db.update_item(
table_name="dev_jobs",
key={
"company_name": "Google",
"role_id": "111"
},
attributes_to_update={
'benefits': "Free Food"
},
operation="DELETE_ATTRIBUTE_FROM_STRING_SET"
)
logging.info("Update is successful")
item = db.read_item(
table_name="dev_jobs",
key={
"company_name": "Google",
"role_id": "111"
}
)
logging.info(f"Item: {item}")
except UnexpectedError as e:
logging.error(f"Update failed - {e}")
"""
dineshsonachalam@macbook examples % python 12-delete-an-attribute-from-the-string-set.py
INFO:botocore.credentials:Found credentials in environment variables.
INFO:root:Update is successful
INFO:root:Item: {
'locations': ['Mountain View, California', 'Austin, Texas', 'Chicago, IL', 'Detroit, Michigan'],
'role_id': '111',
'overall_review': {
'compensation_and_benefits': '3.9/5',
'overall_rating': '4/5',
'yearly_bonus_percent': Decimal('12')
},
'company_name': 'Google',
'role': 'Staff Software Engineer 2',
'salary': '$1,50,531',
'benefits': {
'Internet, Medical, Edu reimbursements',
'Health insurance',
'Travel reimbursements'
}
}
"""
```
#### Delete an item
```py
from LucidDynamodb import DynamoDb
from LucidDynamodb.exceptions import (
UnexpectedError
)
from boto3.dynamodb.conditions import Key
import logging
logging.basicConfig(level=logging.INFO)
if __name__ == "__main__":
try:
db = DynamoDb()
db.delete_item(
table_name="dev_jobs",
key={
"company_name": "Google",
"role_id": "111"
}
)
logging.info("Item deleted successfully")
items = db.read_items_by_filter(
table_name='dev_jobs',
key_condition_expression=Key("company_name").eq("Google")
)
logging.info(f"Items: {items}")
except UnexpectedError as e:
logging.warning(f"Item delete operation failed - {e}")
"""
dineshsonachalam@macbook examples % python 13-delete-an-item.py
INFO:botocore.credentials:Found credentials in environment variables.
INFO:root:Item deleted successfully
INFO:root:Items: [{
'locations': ['Mountain View, California'],
'role_id': '112',
'overall_review': {
'compensation_and_benefits': '4.2/5',
'overall_rating': '3/5'
},
'company_name': 'Google',
'role': 'Software Architect',
'yearly_hike_percent': Decimal('13'),
'salary': '$4,80,000',
'benefits': {
'Internet reimbursements'
}
}]
"""
```
#### Delete a table
```py
from LucidDynamodb import DynamoDb
from LucidDynamodb.exceptions import (
TableNotFound
)
import logging
logging.basicConfig(level=logging.INFO)
if __name__ == "__main__":
try:
db = DynamoDb()
db.delete_table(table_name='dev_jobs')
logging.info("Table deleted successfully")
table_names = db.read_all_table_names()
logging.info(f"Table names: {table_names}")
except TableNotFound as e:
logging.error(f"Table delete operation failed {e}")
"""
dineshsonachalam@macbook examples % python 14-delete-a-table.py
INFO:botocore.credentials:Found credentials in environment variables.
INFO:root:Table deleted successfully
INFO:root:Table names: ['CertMagic', 'dev_test', 'kp-config-v1', 'test-1']
"""
```
## Running Tests
To run tests, run the following command
```bash
pytest -s
```
## License
[MIT](https://choosealicense.com/licenses/mit/) © [dineshsonachalam](https://www.github.com/dineshsonachalam)
%package -n python3-LucidDynamodb
Summary: A simple Python wrapper to AWS Dynamodb
Provides: python-LucidDynamodb
BuildRequires: python3-devel
BuildRequires: python3-setuptools
BuildRequires: python3-pip
%description -n python3-LucidDynamodb
A minimalistic wrapper to AWS DynamoDB
Useful links:
- See the full documentation at https://lucid-dynamodb.dineshsonachalam.com
- Ask questions in the GitHub issues
## Table of contents
- [Installation](#installation)
- [Example](#example)
- [Connect to DynamodDB](#connect-to-dynamodb)
- [Create a new table](#create-a-new-table)
- [Get all table names](#get-all-table-names)
- [Create a New Item](#create-a-new-item)
- [Read an Item](#read-an-item)
- [Read items by filter](#read-items-by-filter)
- [Update existing attribute in an item](#update-existing-attribute-in-an-item)
- [Add a new attribute in an item](#add-a-new-attribute-in-an-item)
- [Add an attribute to the list](#add-an-attribute-to-the-list)
- [Add an attribute to the string set](#add-an-attribute-to-the-string-set)
- [Increase an existing attribute value](#increase-an-existing-attribute-value)
- [Delete an attribute from an item](#delete-an-attribute-from-an-item)
- [Delete an attribute from the string set](#delete-an-attribute-from-the-string-set)
- [Delete an item](#delete-an-item)
- [Delete a table](#delete-a-table)
- [Running tests](#running-tests)
- [Github Workflow Artifacts](#github-workflow-artifacts)
- [License](#license)
## Installation
```console
pip install LucidDynamodb
```
**Note:** Prerequisite for Python3 development
## Example
#### Connect to DynamoDB
You can connect to DynamoDB by following any of these two ways.
1. Using AWS config
```py
from LucidDynamodb import DynamoDb
db = DynamoDb()
"""
$ pip install awscli #can add user flag
$ aws configure
AWS Access Key ID [****************ABCD]:[enter your key here]
AWS Secret Access Key [****************xyz]:[enter your secret key here]
Default region name [us-west-2]:[enter your region here]
Default output format [None]:
"""
```
2. Using AWS secret key
```py
from LucidDynamodb import DynamoDb
import os
AWS_ACCESS_KEY_ID = os.getenv("AWS_ACCESS_KEY_ID")
AWS_SECRET_ACCESS_KEY = os.getenv("AWS_SECRET_ACCESS_KEY")
db = DynamoDb(region_name="us-east-1",
aws_access_key_id=AWS_ACCESS_KEY_ID,
aws_secret_access_key=AWS_SECRET_ACCESS_KEY)
```
#### Create a new table
```py
from LucidDynamodb import DynamoDb
from LucidDynamodb.exceptions import (
TableAlreadyExists
)
import logging
logging.basicConfig(level=logging.INFO)
table_schema = {
"TableName": "dev_jobs",
"KeySchema": [{
"AttributeName": "company_name",
"KeyType": "HASH"
},
{
"AttributeName": "role_id",
"KeyType": "RANGE"
}
],
"AttributeDefinitions": [{
"AttributeName": "company_name",
"AttributeType": "S"
},
{
"AttributeName": "role_id",
"AttributeType": "S"
}
],
"GlobalSecondaryIndexes": [],
"ProvisionedThroughput": {
"ReadCapacityUnits": 1,
"WriteCapacityUnits": 1
}
}
if __name__ == "__main__":
try:
db = DynamoDb()
db.create_table(
table_name=table_schema.get("TableName"),
key_schema=table_schema.get("KeySchema"),
attribute_definitions=table_schema.get("AttributeDefinitions"),
global_secondary_indexes=table_schema.get("GlobalSecondaryIndexes"),
provisioned_throughput=table_schema.get("ProvisionedThroughput")
)
logging.info(f"{table_schema.get('TableName')} table created successfully")
except TableAlreadyExists as e:
logging.error(f"{table_schema.get('TableName')} table creation failed - {e}")
"""
dineshsonachalam@macbook examples % python 1-create-a-new-table.py
INFO:botocore.credentials:Found credentials in environment variables.
INFO:root:dev_jobs table created successfully
"""
```
#### Get all table names
```py
from LucidDynamodb import DynamoDb
from LucidDynamodb.exceptions import (
UnexpectedError
)
import logging
logging.basicConfig(level=logging.INFO)
if __name__ == "__main__":
try:
db = DynamoDb()
table_names = db.read_all_table_names()
logging.info(f"Table names: {table_names}")
except UnexpectedError as e:
logging.error(f"Read all table names failed - {e}")
"""
dineshsonachalam@macbook examples % python 2-get-all-table-names.py
INFO:botocore.credentials:Found credentials in environment variables.
INFO:root:Table names: ['CertMagic', 'dev_jobs', 'dev_test', 'kp-config-v1', 'test-1']
"""
```
#### Create a new item
```py
from LucidDynamodb import DynamoDb
from LucidDynamodb.exceptions import (
UnexpectedError
)
import logging
logging.basicConfig(level=logging.INFO)
if __name__ == "__main__":
try:
db = DynamoDb()
db.create_item(
table_name="dev_jobs",
item={
"company_name": "Google",
"role_id": "111",
"role": "Software Engineer 1",
"salary": "$1,50,531",
"locations": ["Mountain View, California", "Austin, Texas", "Chicago, IL"],
"yearly_hike_percent": 8,
"benefits": set(["Internet, Medical, Edu reimbursements",
"Health insurance",
"Travel reimbursements"
]),
"overall_review":{
"overall_rating" : "4/5",
"compensation_and_benefits": "3.9/5"
}
}
)
logging.info("Item created successfully")
except UnexpectedError as e:
logging.error(f"Item creation failed - {e}")
"""
dineshsonachalam@macbook examples % python 3-create-a-new-item.py
INFO:botocore.credentials:Found credentials in environment variables.
INFO:root:Item created successfully
"""
```
#### Read an item
```py
from LucidDynamodb import DynamoDb
from LucidDynamodb.exceptions import (
ItemNotFound
)
import logging
logging.basicConfig(level=logging.INFO)
if __name__ == "__main__":
try:
db = DynamoDb()
item = db.read_item(
table_name="dev_jobs",
key={
"company_name": "Google",
"role_id": "111"
}
)
logging.info(f"Item: {item}")
except ItemNotFound as e:
logging.error(f"Item doesn't exist - {e}")
"""
dineshsonachalam@macbook examples % python 4-read-an-item.py
INFO:botocore.credentials:Found credentials in environment variables.
INFO:root:Item: {
'locations': ['Mountain View, California', 'Austin, Texas', 'Chicago, IL'],
'role_id': '111',
'overall_review': {
'compensation_and_benefits': '3.9/5',
'overall_rating': '4/5'
},
'company_name': 'Google',
'role': 'Software Engineer 1',
'yearly_hike_percent': Decimal('8'),
'salary': '$1,50,531',
'benefits': {
'Travel reimbursements',
'Internet, Medical, Edu reimbursements',
'Health insurance'
}
}
"""
```
#### Read items by filter
```py
from LucidDynamodb import DynamoDb
from LucidDynamodb.exceptions import (
QueryFilterValidationFailed
)
import logging
from boto3.dynamodb.conditions import Key
logging.basicConfig(level=logging.INFO)
if __name__ == "__main__":
try:
db = DynamoDb()
db.create_item(
table_name="dev_jobs",
item={
"company_name": "Google",
"role_id": "112",
"role": "Software Architect",
"salary": "$4,80,000",
"locations": ["Mountain View, California"],
"yearly_hike_percent": 13,
"benefits": set(["Internet reimbursements"]),
"overall_review":{
"overall_rating" : "3/5",
"compensation_and_benefits": "4.2/5"
}
}
)
logging.info("Item created successfully")
items = db.read_items_by_filter(
table_name='dev_jobs',
key_condition_expression=Key("company_name").eq("Google")
)
logging.info(f"Items: {items}")
except QueryFilterValidationFailed as e:
logging.error(f"Items doesn't exist - {e}")
"""
dineshsonachalam@macbook examples % python 5-read-items-by-filter.py
INFO:botocore.credentials:Found credentials in environment variables.
INFO:root:Item created successfully
INFO:root:Items: [{
'locations': ['Mountain View, California', 'Austin, Texas', 'Chicago, IL'],
'role_id': '111',
'overall_review': {
'compensation_and_benefits': '3.9/5',
'overall_rating': '4/5'
},
'company_name': 'Google',
'role': 'Software Engineer 1',
'yearly_hike_percent': Decimal('8'),
'salary': '$1,50,531',
'benefits': {
'Internet, Medical, Edu reimbursements',
'Travel reimbursements',
'Health insurance'
}
}, {
'locations': ['Mountain View, California'],
'role_id': '112',
'overall_review': {
'compensation_and_benefits': '4.2/5',
'overall_rating': '3/5'
},
'company_name': 'Google',
'role': 'Software Architect',
'yearly_hike_percent': Decimal('13'),
'salary': '$4,80,000',
'benefits': {
'Internet reimbursements'
}
}]
"""
```
#### Update existing attribute in an item
```py
from LucidDynamodb import DynamoDb
from LucidDynamodb.exceptions import (
UnexpectedError
)
import logging
logging.basicConfig(level=logging.INFO)
if __name__ == "__main__":
try:
db = DynamoDb()
db.update_item(
table_name="dev_jobs",
key={
"company_name": "Google",
"role_id": "111"
},
attributes_to_update={
'role': 'Staff Software Engineer 2'
}
)
logging.info("Update is successful")
item = db.read_item(
table_name="dev_jobs",
key={
"company_name": "Google",
"role_id": "111"
}
)
logging.info(f"Item: {item}")
except UnexpectedError as e:
logging.error(f"Update failed - {e}")
"""
dineshsonachalam@macbook examples % python 6-update-existing-attribute-in-an-item.py
INFO:botocore.credentials:Found credentials in environment variables.
INFO:root:Update is successful
INFO:root:Item: {
'locations': ['Mountain View, California', 'Austin, Texas', 'Chicago, IL'],
'role_id': '111',
'overall_review': {
'compensation_and_benefits': '3.9/5',
'overall_rating': '4/5'
},
'company_name': 'Google',
'role': 'Staff Software Engineer 2',
'yearly_hike_percent': Decimal('8'),
'salary': '$1,50,531',
'benefits': {
'Health insurance',
'Internet, Medical, Edu reimbursements',
'Travel reimbursements'
}
}
"""
```
#### Add a new attribute in an item
```py
from LucidDynamodb import DynamoDb
from LucidDynamodb.exceptions import (
UnexpectedError
)
import logging
logging.basicConfig(level=logging.INFO)
if __name__ == "__main__":
try:
db = DynamoDb()
db.update_item(
table_name="dev_jobs",
key={
"company_name": "Google",
"role_id": "111"
},
attributes_to_update={
'overall_review.yearly_bonus_percent': 12
}
)
logging.info("Update is successful")
item = db.read_item(
table_name="dev_jobs",
key={
"company_name": "Google",
"role_id": "111"
}
)
logging.info(f"Item: {item}")
except UnexpectedError as e:
logging.error(f"Update failed - {e}")
"""
dineshsonachalam@macbook examples % python 7-add-a-new-attribute-in-an-item.py
INFO:botocore.credentials:Found credentials in environment variables.
INFO:root:Update is successful
INFO:root:Item: {
'locations': ['Mountain View, California', 'Austin, Texas', 'Chicago, IL'],
'role_id': '111',
'overall_review': {
'compensation_and_benefits': '3.9/5',
'overall_rating': '4/5',
'yearly_bonus_percent': Decimal('12')
},
'company_name': 'Google',
'role': 'Staff Software Engineer 2',
'yearly_hike_percent': Decimal('8'),
'salary': '$1,50,531',
'benefits': {
'Travel reimbursements',
'Internet, Medical, Edu reimbursements',
'Health insurance'
}
}
"""
```
#### Add an attribute to the list
```py
from LucidDynamodb import DynamoDb
from LucidDynamodb.exceptions import (
UnexpectedError
)
import logging
logging.basicConfig(level=logging.INFO)
if __name__ == "__main__":
try:
db = DynamoDb()
db.update_item(
table_name="dev_jobs",
key={
"company_name": "Google",
"role_id": "111"
},
attributes_to_update={
'locations': "Detroit, Michigan"
},
operation="ADD_ATTRIBUTE_TO_LIST"
)
logging.info("Update is successful")
item = db.read_item(
table_name="dev_jobs",
key={
"company_name": "Google",
"role_id": "111"
}
)
logging.info(f"Item: {item}")
except UnexpectedError as e:
logging.error(f"Update failed - {e}")
"""
dineshsonachalam@macbook examples % python 8-add-an-attribute-to-the-list.py
INFO:botocore.credentials:Found credentials in environment variables.
INFO:root:Update is successful
INFO:root:Item: {
'locations': ['Mountain View, California', 'Austin, Texas', 'Chicago, IL', 'Detroit, Michigan'],
'role_id': '111',
'overall_review': {
'compensation_and_benefits': '3.9/5',
'overall_rating': '4/5',
'yearly_bonus_percent': Decimal('12')
},
'company_name': 'Google',
'role': 'Staff Software Engineer 2',
'yearly_hike_percent': Decimal('8'),
'salary': '$1,50,531',
'benefits': {
'Health insurance',
'Travel reimbursements',
'Internet, Medical, Edu reimbursements'
}
}
"""
```
#### Add an attribute to the string set
```py
from LucidDynamodb import DynamoDb
from LucidDynamodb.exceptions import (
UnexpectedError
)
import logging
logging.basicConfig(level=logging.INFO)
if __name__ == "__main__":
try:
db = DynamoDb()
db.update_item(
table_name="dev_jobs",
key={
"company_name": "Google",
"role_id": "111"
},
attributes_to_update={
'benefits': "Free Food"
},
operation="ADD_ATTRIBUTE_TO_STRING_SET"
)
logging.info("Update is successful")
item = db.read_item(
table_name="dev_jobs",
key={
"company_name": "Google",
"role_id": "111"
}
)
logging.info(f"Item: {item}")
except UnexpectedError as e:
logging.error(f"Update failed - {e}")
"""
dineshsonachalam@macbook examples % python 9-add-an-attribute-to-the-string-set.py
INFO:botocore.credentials:Found credentials in environment variables.
INFO:root:Update is successful
INFO:root:Item: {
'locations': ['Mountain View, California', 'Austin, Texas', 'Chicago, IL', 'Detroit, Michigan'],
'role_id': '111',
'overall_review': {
'compensation_and_benefits': '3.9/5',
'overall_rating': '4/5',
'yearly_bonus_percent': Decimal('12')
},
'company_name': 'Google',
'role': 'Staff Software Engineer 2',
'yearly_hike_percent': Decimal('8'),
'salary': '$1,50,531',
'benefits': {
'Travel reimbursements',
'Free Food',
'Health insurance',
'Internet, Medical, Edu reimbursements'
}
}
"""
```
#### Increase an existing attribute value
```py
from LucidDynamodb import DynamoDb
from LucidDynamodb.exceptions import (
UnexpectedError
)
import logging
logging.basicConfig(level=logging.INFO)
if __name__ == "__main__":
try:
db = DynamoDb()
db.increase_attribute_value(
table_name='dev_jobs',
key={
"company_name": "Google",
"role_id": "111"
},
attribute_name="yearly_hike_percent",
increment_value=5
)
logging.info("Attribute value increment completed")
item = db.read_item(
table_name='dev_jobs',
key={
"company_name": "Google",
"role_id": "111"
}
)
logging.info(f"Item: {item}")
except UnexpectedError as e:
logging.error(f"Attribute value increment failed - {e}")
"""
dineshsonachalam@macbook examples % python 10-increase-an-existing-attribute-value.py
INFO:botocore.credentials:Found credentials in environment variables.
INFO:root:Attribute value increment completed
INFO:root:Item: {
'locations': ['Mountain View, California', 'Austin, Texas', 'Chicago, IL', 'Detroit, Michigan'],
'role_id': '111',
'overall_review': {
'compensation_and_benefits': '3.9/5',
'overall_rating': '4/5',
'yearly_bonus_percent': Decimal('12')
},
'company_name': 'Google',
'role': 'Staff Software Engineer 2',
'yearly_hike_percent': Decimal('13'),
'salary': '$1,50,531',
'benefits': {
'Internet, Medical, Edu reimbursements',
'Free Food',
'Health insurance',
'Travel reimbursements'
}
}
"""
```
#### Delete an attribute from an item
```py
from LucidDynamodb import DynamoDb
from LucidDynamodb.exceptions import (
UnexpectedError
)
import logging
logging.basicConfig(level=logging.INFO)
if __name__ == "__main__":
try:
db = DynamoDb()
db.delete_attribute(
table_name="dev_jobs",
key={"company_name": "Google", "role_id": "111"},
attribute_name="yearly_hike_percent")
logging.info("The attribute is deleted successfully")
item = db.read_item(
table_name="dev_jobs",
key={
"company_name": "Google",
"role_id": "111"
}
)
logging.info(f"Item: {item}")
except UnexpectedError as e:
logging.error(f"The attribute delete operation failed - {e}")
"""
dineshsonachalam@macbook examples % python 11-delete-an-attribute-from-an-item.py
INFO:botocore.credentials:Found credentials in environment variables.
INFO:root:The attribute is deleted successfully
INFO:root:Item: {
'locations': ['Mountain View, California', 'Austin, Texas', 'Chicago, IL', 'Detroit, Michigan'],
'role_id': '111',
'overall_review': {
'compensation_and_benefits': '3.9/5',
'overall_rating': '4/5',
'yearly_bonus_percent': Decimal('12')
},
'company_name': 'Google',
'role': 'Staff Software Engineer 2',
'salary': '$1,50,531',
'benefits': {
'Travel reimbursements',
'Free Food',
'Health insurance',
'Internet, Medical, Edu reimbursements'
}
}
"""
```
#### Delete an attribute from the string set
```py
from LucidDynamodb import DynamoDb
from LucidDynamodb.exceptions import (
UnexpectedError
)
import logging
logging.basicConfig(level=logging.INFO)
if __name__ == "__main__":
try:
db = DynamoDb()
db.update_item(
table_name="dev_jobs",
key={
"company_name": "Google",
"role_id": "111"
},
attributes_to_update={
'benefits': "Free Food"
},
operation="DELETE_ATTRIBUTE_FROM_STRING_SET"
)
logging.info("Update is successful")
item = db.read_item(
table_name="dev_jobs",
key={
"company_name": "Google",
"role_id": "111"
}
)
logging.info(f"Item: {item}")
except UnexpectedError as e:
logging.error(f"Update failed - {e}")
"""
dineshsonachalam@macbook examples % python 12-delete-an-attribute-from-the-string-set.py
INFO:botocore.credentials:Found credentials in environment variables.
INFO:root:Update is successful
INFO:root:Item: {
'locations': ['Mountain View, California', 'Austin, Texas', 'Chicago, IL', 'Detroit, Michigan'],
'role_id': '111',
'overall_review': {
'compensation_and_benefits': '3.9/5',
'overall_rating': '4/5',
'yearly_bonus_percent': Decimal('12')
},
'company_name': 'Google',
'role': 'Staff Software Engineer 2',
'salary': '$1,50,531',
'benefits': {
'Internet, Medical, Edu reimbursements',
'Health insurance',
'Travel reimbursements'
}
}
"""
```
#### Delete an item
```py
from LucidDynamodb import DynamoDb
from LucidDynamodb.exceptions import (
UnexpectedError
)
from boto3.dynamodb.conditions import Key
import logging
logging.basicConfig(level=logging.INFO)
if __name__ == "__main__":
try:
db = DynamoDb()
db.delete_item(
table_name="dev_jobs",
key={
"company_name": "Google",
"role_id": "111"
}
)
logging.info("Item deleted successfully")
items = db.read_items_by_filter(
table_name='dev_jobs',
key_condition_expression=Key("company_name").eq("Google")
)
logging.info(f"Items: {items}")
except UnexpectedError as e:
logging.warning(f"Item delete operation failed - {e}")
"""
dineshsonachalam@macbook examples % python 13-delete-an-item.py
INFO:botocore.credentials:Found credentials in environment variables.
INFO:root:Item deleted successfully
INFO:root:Items: [{
'locations': ['Mountain View, California'],
'role_id': '112',
'overall_review': {
'compensation_and_benefits': '4.2/5',
'overall_rating': '3/5'
},
'company_name': 'Google',
'role': 'Software Architect',
'yearly_hike_percent': Decimal('13'),
'salary': '$4,80,000',
'benefits': {
'Internet reimbursements'
}
}]
"""
```
#### Delete a table
```py
from LucidDynamodb import DynamoDb
from LucidDynamodb.exceptions import (
TableNotFound
)
import logging
logging.basicConfig(level=logging.INFO)
if __name__ == "__main__":
try:
db = DynamoDb()
db.delete_table(table_name='dev_jobs')
logging.info("Table deleted successfully")
table_names = db.read_all_table_names()
logging.info(f"Table names: {table_names}")
except TableNotFound as e:
logging.error(f"Table delete operation failed {e}")
"""
dineshsonachalam@macbook examples % python 14-delete-a-table.py
INFO:botocore.credentials:Found credentials in environment variables.
INFO:root:Table deleted successfully
INFO:root:Table names: ['CertMagic', 'dev_test', 'kp-config-v1', 'test-1']
"""
```
## Running Tests
To run tests, run the following command
```bash
pytest -s
```
## License
[MIT](https://choosealicense.com/licenses/mit/) © [dineshsonachalam](https://www.github.com/dineshsonachalam)
%package help
Summary: Development documents and examples for LucidDynamodb
Provides: python3-LucidDynamodb-doc
%description help
A minimalistic wrapper to AWS DynamoDB
Useful links:
- See the full documentation at https://lucid-dynamodb.dineshsonachalam.com
- Ask questions in the GitHub issues
## Table of contents
- [Installation](#installation)
- [Example](#example)
- [Connect to DynamodDB](#connect-to-dynamodb)
- [Create a new table](#create-a-new-table)
- [Get all table names](#get-all-table-names)
- [Create a New Item](#create-a-new-item)
- [Read an Item](#read-an-item)
- [Read items by filter](#read-items-by-filter)
- [Update existing attribute in an item](#update-existing-attribute-in-an-item)
- [Add a new attribute in an item](#add-a-new-attribute-in-an-item)
- [Add an attribute to the list](#add-an-attribute-to-the-list)
- [Add an attribute to the string set](#add-an-attribute-to-the-string-set)
- [Increase an existing attribute value](#increase-an-existing-attribute-value)
- [Delete an attribute from an item](#delete-an-attribute-from-an-item)
- [Delete an attribute from the string set](#delete-an-attribute-from-the-string-set)
- [Delete an item](#delete-an-item)
- [Delete a table](#delete-a-table)
- [Running tests](#running-tests)
- [Github Workflow Artifacts](#github-workflow-artifacts)
- [License](#license)
## Installation
```console
pip install LucidDynamodb
```
**Note:** Prerequisite for Python3 development
## Example
#### Connect to DynamoDB
You can connect to DynamoDB by following any of these two ways.
1. Using AWS config
```py
from LucidDynamodb import DynamoDb
db = DynamoDb()
"""
$ pip install awscli #can add user flag
$ aws configure
AWS Access Key ID [****************ABCD]:[enter your key here]
AWS Secret Access Key [****************xyz]:[enter your secret key here]
Default region name [us-west-2]:[enter your region here]
Default output format [None]:
"""
```
2. Using AWS secret key
```py
from LucidDynamodb import DynamoDb
import os
AWS_ACCESS_KEY_ID = os.getenv("AWS_ACCESS_KEY_ID")
AWS_SECRET_ACCESS_KEY = os.getenv("AWS_SECRET_ACCESS_KEY")
db = DynamoDb(region_name="us-east-1",
aws_access_key_id=AWS_ACCESS_KEY_ID,
aws_secret_access_key=AWS_SECRET_ACCESS_KEY)
```
#### Create a new table
```py
from LucidDynamodb import DynamoDb
from LucidDynamodb.exceptions import (
TableAlreadyExists
)
import logging
logging.basicConfig(level=logging.INFO)
table_schema = {
"TableName": "dev_jobs",
"KeySchema": [{
"AttributeName": "company_name",
"KeyType": "HASH"
},
{
"AttributeName": "role_id",
"KeyType": "RANGE"
}
],
"AttributeDefinitions": [{
"AttributeName": "company_name",
"AttributeType": "S"
},
{
"AttributeName": "role_id",
"AttributeType": "S"
}
],
"GlobalSecondaryIndexes": [],
"ProvisionedThroughput": {
"ReadCapacityUnits": 1,
"WriteCapacityUnits": 1
}
}
if __name__ == "__main__":
try:
db = DynamoDb()
db.create_table(
table_name=table_schema.get("TableName"),
key_schema=table_schema.get("KeySchema"),
attribute_definitions=table_schema.get("AttributeDefinitions"),
global_secondary_indexes=table_schema.get("GlobalSecondaryIndexes"),
provisioned_throughput=table_schema.get("ProvisionedThroughput")
)
logging.info(f"{table_schema.get('TableName')} table created successfully")
except TableAlreadyExists as e:
logging.error(f"{table_schema.get('TableName')} table creation failed - {e}")
"""
dineshsonachalam@macbook examples % python 1-create-a-new-table.py
INFO:botocore.credentials:Found credentials in environment variables.
INFO:root:dev_jobs table created successfully
"""
```
#### Get all table names
```py
from LucidDynamodb import DynamoDb
from LucidDynamodb.exceptions import (
UnexpectedError
)
import logging
logging.basicConfig(level=logging.INFO)
if __name__ == "__main__":
try:
db = DynamoDb()
table_names = db.read_all_table_names()
logging.info(f"Table names: {table_names}")
except UnexpectedError as e:
logging.error(f"Read all table names failed - {e}")
"""
dineshsonachalam@macbook examples % python 2-get-all-table-names.py
INFO:botocore.credentials:Found credentials in environment variables.
INFO:root:Table names: ['CertMagic', 'dev_jobs', 'dev_test', 'kp-config-v1', 'test-1']
"""
```
#### Create a new item
```py
from LucidDynamodb import DynamoDb
from LucidDynamodb.exceptions import (
UnexpectedError
)
import logging
logging.basicConfig(level=logging.INFO)
if __name__ == "__main__":
try:
db = DynamoDb()
db.create_item(
table_name="dev_jobs",
item={
"company_name": "Google",
"role_id": "111",
"role": "Software Engineer 1",
"salary": "$1,50,531",
"locations": ["Mountain View, California", "Austin, Texas", "Chicago, IL"],
"yearly_hike_percent": 8,
"benefits": set(["Internet, Medical, Edu reimbursements",
"Health insurance",
"Travel reimbursements"
]),
"overall_review":{
"overall_rating" : "4/5",
"compensation_and_benefits": "3.9/5"
}
}
)
logging.info("Item created successfully")
except UnexpectedError as e:
logging.error(f"Item creation failed - {e}")
"""
dineshsonachalam@macbook examples % python 3-create-a-new-item.py
INFO:botocore.credentials:Found credentials in environment variables.
INFO:root:Item created successfully
"""
```
#### Read an item
```py
from LucidDynamodb import DynamoDb
from LucidDynamodb.exceptions import (
ItemNotFound
)
import logging
logging.basicConfig(level=logging.INFO)
if __name__ == "__main__":
try:
db = DynamoDb()
item = db.read_item(
table_name="dev_jobs",
key={
"company_name": "Google",
"role_id": "111"
}
)
logging.info(f"Item: {item}")
except ItemNotFound as e:
logging.error(f"Item doesn't exist - {e}")
"""
dineshsonachalam@macbook examples % python 4-read-an-item.py
INFO:botocore.credentials:Found credentials in environment variables.
INFO:root:Item: {
'locations': ['Mountain View, California', 'Austin, Texas', 'Chicago, IL'],
'role_id': '111',
'overall_review': {
'compensation_and_benefits': '3.9/5',
'overall_rating': '4/5'
},
'company_name': 'Google',
'role': 'Software Engineer 1',
'yearly_hike_percent': Decimal('8'),
'salary': '$1,50,531',
'benefits': {
'Travel reimbursements',
'Internet, Medical, Edu reimbursements',
'Health insurance'
}
}
"""
```
#### Read items by filter
```py
from LucidDynamodb import DynamoDb
from LucidDynamodb.exceptions import (
QueryFilterValidationFailed
)
import logging
from boto3.dynamodb.conditions import Key
logging.basicConfig(level=logging.INFO)
if __name__ == "__main__":
try:
db = DynamoDb()
db.create_item(
table_name="dev_jobs",
item={
"company_name": "Google",
"role_id": "112",
"role": "Software Architect",
"salary": "$4,80,000",
"locations": ["Mountain View, California"],
"yearly_hike_percent": 13,
"benefits": set(["Internet reimbursements"]),
"overall_review":{
"overall_rating" : "3/5",
"compensation_and_benefits": "4.2/5"
}
}
)
logging.info("Item created successfully")
items = db.read_items_by_filter(
table_name='dev_jobs',
key_condition_expression=Key("company_name").eq("Google")
)
logging.info(f"Items: {items}")
except QueryFilterValidationFailed as e:
logging.error(f"Items doesn't exist - {e}")
"""
dineshsonachalam@macbook examples % python 5-read-items-by-filter.py
INFO:botocore.credentials:Found credentials in environment variables.
INFO:root:Item created successfully
INFO:root:Items: [{
'locations': ['Mountain View, California', 'Austin, Texas', 'Chicago, IL'],
'role_id': '111',
'overall_review': {
'compensation_and_benefits': '3.9/5',
'overall_rating': '4/5'
},
'company_name': 'Google',
'role': 'Software Engineer 1',
'yearly_hike_percent': Decimal('8'),
'salary': '$1,50,531',
'benefits': {
'Internet, Medical, Edu reimbursements',
'Travel reimbursements',
'Health insurance'
}
}, {
'locations': ['Mountain View, California'],
'role_id': '112',
'overall_review': {
'compensation_and_benefits': '4.2/5',
'overall_rating': '3/5'
},
'company_name': 'Google',
'role': 'Software Architect',
'yearly_hike_percent': Decimal('13'),
'salary': '$4,80,000',
'benefits': {
'Internet reimbursements'
}
}]
"""
```
#### Update existing attribute in an item
```py
from LucidDynamodb import DynamoDb
from LucidDynamodb.exceptions import (
UnexpectedError
)
import logging
logging.basicConfig(level=logging.INFO)
if __name__ == "__main__":
try:
db = DynamoDb()
db.update_item(
table_name="dev_jobs",
key={
"company_name": "Google",
"role_id": "111"
},
attributes_to_update={
'role': 'Staff Software Engineer 2'
}
)
logging.info("Update is successful")
item = db.read_item(
table_name="dev_jobs",
key={
"company_name": "Google",
"role_id": "111"
}
)
logging.info(f"Item: {item}")
except UnexpectedError as e:
logging.error(f"Update failed - {e}")
"""
dineshsonachalam@macbook examples % python 6-update-existing-attribute-in-an-item.py
INFO:botocore.credentials:Found credentials in environment variables.
INFO:root:Update is successful
INFO:root:Item: {
'locations': ['Mountain View, California', 'Austin, Texas', 'Chicago, IL'],
'role_id': '111',
'overall_review': {
'compensation_and_benefits': '3.9/5',
'overall_rating': '4/5'
},
'company_name': 'Google',
'role': 'Staff Software Engineer 2',
'yearly_hike_percent': Decimal('8'),
'salary': '$1,50,531',
'benefits': {
'Health insurance',
'Internet, Medical, Edu reimbursements',
'Travel reimbursements'
}
}
"""
```
#### Add a new attribute in an item
```py
from LucidDynamodb import DynamoDb
from LucidDynamodb.exceptions import (
UnexpectedError
)
import logging
logging.basicConfig(level=logging.INFO)
if __name__ == "__main__":
try:
db = DynamoDb()
db.update_item(
table_name="dev_jobs",
key={
"company_name": "Google",
"role_id": "111"
},
attributes_to_update={
'overall_review.yearly_bonus_percent': 12
}
)
logging.info("Update is successful")
item = db.read_item(
table_name="dev_jobs",
key={
"company_name": "Google",
"role_id": "111"
}
)
logging.info(f"Item: {item}")
except UnexpectedError as e:
logging.error(f"Update failed - {e}")
"""
dineshsonachalam@macbook examples % python 7-add-a-new-attribute-in-an-item.py
INFO:botocore.credentials:Found credentials in environment variables.
INFO:root:Update is successful
INFO:root:Item: {
'locations': ['Mountain View, California', 'Austin, Texas', 'Chicago, IL'],
'role_id': '111',
'overall_review': {
'compensation_and_benefits': '3.9/5',
'overall_rating': '4/5',
'yearly_bonus_percent': Decimal('12')
},
'company_name': 'Google',
'role': 'Staff Software Engineer 2',
'yearly_hike_percent': Decimal('8'),
'salary': '$1,50,531',
'benefits': {
'Travel reimbursements',
'Internet, Medical, Edu reimbursements',
'Health insurance'
}
}
"""
```
#### Add an attribute to the list
```py
from LucidDynamodb import DynamoDb
from LucidDynamodb.exceptions import (
UnexpectedError
)
import logging
logging.basicConfig(level=logging.INFO)
if __name__ == "__main__":
try:
db = DynamoDb()
db.update_item(
table_name="dev_jobs",
key={
"company_name": "Google",
"role_id": "111"
},
attributes_to_update={
'locations': "Detroit, Michigan"
},
operation="ADD_ATTRIBUTE_TO_LIST"
)
logging.info("Update is successful")
item = db.read_item(
table_name="dev_jobs",
key={
"company_name": "Google",
"role_id": "111"
}
)
logging.info(f"Item: {item}")
except UnexpectedError as e:
logging.error(f"Update failed - {e}")
"""
dineshsonachalam@macbook examples % python 8-add-an-attribute-to-the-list.py
INFO:botocore.credentials:Found credentials in environment variables.
INFO:root:Update is successful
INFO:root:Item: {
'locations': ['Mountain View, California', 'Austin, Texas', 'Chicago, IL', 'Detroit, Michigan'],
'role_id': '111',
'overall_review': {
'compensation_and_benefits': '3.9/5',
'overall_rating': '4/5',
'yearly_bonus_percent': Decimal('12')
},
'company_name': 'Google',
'role': 'Staff Software Engineer 2',
'yearly_hike_percent': Decimal('8'),
'salary': '$1,50,531',
'benefits': {
'Health insurance',
'Travel reimbursements',
'Internet, Medical, Edu reimbursements'
}
}
"""
```
#### Add an attribute to the string set
```py
from LucidDynamodb import DynamoDb
from LucidDynamodb.exceptions import (
UnexpectedError
)
import logging
logging.basicConfig(level=logging.INFO)
if __name__ == "__main__":
try:
db = DynamoDb()
db.update_item(
table_name="dev_jobs",
key={
"company_name": "Google",
"role_id": "111"
},
attributes_to_update={
'benefits': "Free Food"
},
operation="ADD_ATTRIBUTE_TO_STRING_SET"
)
logging.info("Update is successful")
item = db.read_item(
table_name="dev_jobs",
key={
"company_name": "Google",
"role_id": "111"
}
)
logging.info(f"Item: {item}")
except UnexpectedError as e:
logging.error(f"Update failed - {e}")
"""
dineshsonachalam@macbook examples % python 9-add-an-attribute-to-the-string-set.py
INFO:botocore.credentials:Found credentials in environment variables.
INFO:root:Update is successful
INFO:root:Item: {
'locations': ['Mountain View, California', 'Austin, Texas', 'Chicago, IL', 'Detroit, Michigan'],
'role_id': '111',
'overall_review': {
'compensation_and_benefits': '3.9/5',
'overall_rating': '4/5',
'yearly_bonus_percent': Decimal('12')
},
'company_name': 'Google',
'role': 'Staff Software Engineer 2',
'yearly_hike_percent': Decimal('8'),
'salary': '$1,50,531',
'benefits': {
'Travel reimbursements',
'Free Food',
'Health insurance',
'Internet, Medical, Edu reimbursements'
}
}
"""
```
#### Increase an existing attribute value
```py
from LucidDynamodb import DynamoDb
from LucidDynamodb.exceptions import (
UnexpectedError
)
import logging
logging.basicConfig(level=logging.INFO)
if __name__ == "__main__":
try:
db = DynamoDb()
db.increase_attribute_value(
table_name='dev_jobs',
key={
"company_name": "Google",
"role_id": "111"
},
attribute_name="yearly_hike_percent",
increment_value=5
)
logging.info("Attribute value increment completed")
item = db.read_item(
table_name='dev_jobs',
key={
"company_name": "Google",
"role_id": "111"
}
)
logging.info(f"Item: {item}")
except UnexpectedError as e:
logging.error(f"Attribute value increment failed - {e}")
"""
dineshsonachalam@macbook examples % python 10-increase-an-existing-attribute-value.py
INFO:botocore.credentials:Found credentials in environment variables.
INFO:root:Attribute value increment completed
INFO:root:Item: {
'locations': ['Mountain View, California', 'Austin, Texas', 'Chicago, IL', 'Detroit, Michigan'],
'role_id': '111',
'overall_review': {
'compensation_and_benefits': '3.9/5',
'overall_rating': '4/5',
'yearly_bonus_percent': Decimal('12')
},
'company_name': 'Google',
'role': 'Staff Software Engineer 2',
'yearly_hike_percent': Decimal('13'),
'salary': '$1,50,531',
'benefits': {
'Internet, Medical, Edu reimbursements',
'Free Food',
'Health insurance',
'Travel reimbursements'
}
}
"""
```
#### Delete an attribute from an item
```py
from LucidDynamodb import DynamoDb
from LucidDynamodb.exceptions import (
UnexpectedError
)
import logging
logging.basicConfig(level=logging.INFO)
if __name__ == "__main__":
try:
db = DynamoDb()
db.delete_attribute(
table_name="dev_jobs",
key={"company_name": "Google", "role_id": "111"},
attribute_name="yearly_hike_percent")
logging.info("The attribute is deleted successfully")
item = db.read_item(
table_name="dev_jobs",
key={
"company_name": "Google",
"role_id": "111"
}
)
logging.info(f"Item: {item}")
except UnexpectedError as e:
logging.error(f"The attribute delete operation failed - {e}")
"""
dineshsonachalam@macbook examples % python 11-delete-an-attribute-from-an-item.py
INFO:botocore.credentials:Found credentials in environment variables.
INFO:root:The attribute is deleted successfully
INFO:root:Item: {
'locations': ['Mountain View, California', 'Austin, Texas', 'Chicago, IL', 'Detroit, Michigan'],
'role_id': '111',
'overall_review': {
'compensation_and_benefits': '3.9/5',
'overall_rating': '4/5',
'yearly_bonus_percent': Decimal('12')
},
'company_name': 'Google',
'role': 'Staff Software Engineer 2',
'salary': '$1,50,531',
'benefits': {
'Travel reimbursements',
'Free Food',
'Health insurance',
'Internet, Medical, Edu reimbursements'
}
}
"""
```
#### Delete an attribute from the string set
```py
from LucidDynamodb import DynamoDb
from LucidDynamodb.exceptions import (
UnexpectedError
)
import logging
logging.basicConfig(level=logging.INFO)
if __name__ == "__main__":
try:
db = DynamoDb()
db.update_item(
table_name="dev_jobs",
key={
"company_name": "Google",
"role_id": "111"
},
attributes_to_update={
'benefits': "Free Food"
},
operation="DELETE_ATTRIBUTE_FROM_STRING_SET"
)
logging.info("Update is successful")
item = db.read_item(
table_name="dev_jobs",
key={
"company_name": "Google",
"role_id": "111"
}
)
logging.info(f"Item: {item}")
except UnexpectedError as e:
logging.error(f"Update failed - {e}")
"""
dineshsonachalam@macbook examples % python 12-delete-an-attribute-from-the-string-set.py
INFO:botocore.credentials:Found credentials in environment variables.
INFO:root:Update is successful
INFO:root:Item: {
'locations': ['Mountain View, California', 'Austin, Texas', 'Chicago, IL', 'Detroit, Michigan'],
'role_id': '111',
'overall_review': {
'compensation_and_benefits': '3.9/5',
'overall_rating': '4/5',
'yearly_bonus_percent': Decimal('12')
},
'company_name': 'Google',
'role': 'Staff Software Engineer 2',
'salary': '$1,50,531',
'benefits': {
'Internet, Medical, Edu reimbursements',
'Health insurance',
'Travel reimbursements'
}
}
"""
```
#### Delete an item
```py
from LucidDynamodb import DynamoDb
from LucidDynamodb.exceptions import (
UnexpectedError
)
from boto3.dynamodb.conditions import Key
import logging
logging.basicConfig(level=logging.INFO)
if __name__ == "__main__":
try:
db = DynamoDb()
db.delete_item(
table_name="dev_jobs",
key={
"company_name": "Google",
"role_id": "111"
}
)
logging.info("Item deleted successfully")
items = db.read_items_by_filter(
table_name='dev_jobs',
key_condition_expression=Key("company_name").eq("Google")
)
logging.info(f"Items: {items}")
except UnexpectedError as e:
logging.warning(f"Item delete operation failed - {e}")
"""
dineshsonachalam@macbook examples % python 13-delete-an-item.py
INFO:botocore.credentials:Found credentials in environment variables.
INFO:root:Item deleted successfully
INFO:root:Items: [{
'locations': ['Mountain View, California'],
'role_id': '112',
'overall_review': {
'compensation_and_benefits': '4.2/5',
'overall_rating': '3/5'
},
'company_name': 'Google',
'role': 'Software Architect',
'yearly_hike_percent': Decimal('13'),
'salary': '$4,80,000',
'benefits': {
'Internet reimbursements'
}
}]
"""
```
#### Delete a table
```py
from LucidDynamodb import DynamoDb
from LucidDynamodb.exceptions import (
TableNotFound
)
import logging
logging.basicConfig(level=logging.INFO)
if __name__ == "__main__":
try:
db = DynamoDb()
db.delete_table(table_name='dev_jobs')
logging.info("Table deleted successfully")
table_names = db.read_all_table_names()
logging.info(f"Table names: {table_names}")
except TableNotFound as e:
logging.error(f"Table delete operation failed {e}")
"""
dineshsonachalam@macbook examples % python 14-delete-a-table.py
INFO:botocore.credentials:Found credentials in environment variables.
INFO:root:Table deleted successfully
INFO:root:Table names: ['CertMagic', 'dev_test', 'kp-config-v1', 'test-1']
"""
```
## Running Tests
To run tests, run the following command
```bash
pytest -s
```
## License
[MIT](https://choosealicense.com/licenses/mit/) © [dineshsonachalam](https://www.github.com/dineshsonachalam)
%prep
%autosetup -n LucidDynamodb-1.0.128
%build
%py3_build
%install
%py3_install
install -d -m755 %{buildroot}/%{_pkgdocdir}
if [ -d doc ]; then cp -arf doc %{buildroot}/%{_pkgdocdir}; fi
if [ -d docs ]; then cp -arf docs %{buildroot}/%{_pkgdocdir}; fi
if [ -d example ]; then cp -arf example %{buildroot}/%{_pkgdocdir}; fi
if [ -d examples ]; then cp -arf examples %{buildroot}/%{_pkgdocdir}; fi
pushd %{buildroot}
if [ -d usr/lib ]; then
find usr/lib -type f -printf "/%h/%f\n" >> filelist.lst
fi
if [ -d usr/lib64 ]; then
find usr/lib64 -type f -printf "/%h/%f\n" >> filelist.lst
fi
if [ -d usr/bin ]; then
find usr/bin -type f -printf "/%h/%f\n" >> filelist.lst
fi
if [ -d usr/sbin ]; then
find usr/sbin -type f -printf "/%h/%f\n" >> filelist.lst
fi
touch doclist.lst
if [ -d usr/share/man ]; then
find usr/share/man -type f -printf "/%h/%f.gz\n" >> doclist.lst
fi
popd
mv %{buildroot}/filelist.lst .
mv %{buildroot}/doclist.lst .
%files -n python3-LucidDynamodb -f filelist.lst
%dir %{python3_sitelib}/*
%files help -f doclist.lst
%{_docdir}/*
%changelog
* Tue Apr 25 2023 Python_Bot - 1.0.128-1
- Package Spec generated