Package: pynamodb
A Pythonic interface for Amazon’sDynamoDB.DynamoDB is a great NoSQL service provided by Amazon, but the API is verbose.
PynamoDB presents you with a simple, elegant API.Useful links:See the full documentation athttps://pynamodb.readthedocs.io/Ask questions in theGitHub issuesSee release notes athttps://pynamodb.readthedocs.io/en/latest/release_notes.htmlInstallationFrom PyPi:$ pip install pynamodbFrom GitHub:$ pip install git+https://github.com/pynamodb/PynamoDB#egg=pynamodbFrom conda-forge:$ conda install -c conda-forge pynamodbBasic UsageCreate a model that describes your DynamoDB table.frompynamodb.modelsimportModelfrompynamodb.attributesimportUnicodeAttributeclassUserModel(Model):"""
    A DynamoDB User
    """classMeta:table_name="dynamodb-user"email=UnicodeAttribute(null=True)first_name=UnicodeAttribute(range_key=True)last_name=UnicodeAttribute(hash_key=True)PynamoDB allows you to create the table if needed (it must exist before you can use it!):UserModel.create_table(read_capacity_units=1,write_capacity_units=1)Create a new user:user=UserModel("John","Denver")user.email="djohn@company.org"user.save()Now, search your table for all users with a last name of ‘Denver’ and whose
first name begins with ‘J’:foruserinUserModel.query("Denver",UserModel.first_name.startswith("J")):print(user.first_name)Examples of ways to query your table with filter conditions:foruserinUserModel.query("Denver",UserModel.email=="djohn@company.org"):print(user.first_name)Retrieve an existing user:try:user=UserModel.get("John","Denver")print(user)exceptUserModel.DoesNotExist:print("User does not exist")Upgrade WarningThe behavior of ‘UnicodeSetAttribute’ has changed in backwards-incompatible ways
as of the 1.6.0 and 3.0.1 releases of PynamoDB.SeeUnicodeSetAttribute upgrade docsfor detailed instructions on how to safely perform the upgrade.Advanced UsageWant to use indexes? No problem:frompynamodb.modelsimportModelfrompynamodb.indexesimportGlobalSecondaryIndex,AllProjectionfrompynamodb.attributesimportNumberAttribute,UnicodeAttributeclassViewIndex(GlobalSecondaryIndex):classMeta:read_capacity_units=2write_capacity_units=1projection=AllProjection()view=NumberAttribute(default=0,hash_key=True)classTestModel(Model):classMeta:table_name="TestModel"forum=UnicodeAttribute(hash_key=True)thread=UnicodeAttribute(range_key=True)view=NumberAttribute(default=0)view_index=ViewIndex()Now query the index for all items with 0 views:foriteminTestModel.view_index.query(0):print("Item queried from index:{0}".format(item))It’s really that simple.Want to use DynamoDB local? Just add ahostname attribute and specify your local server.frompynamodb.modelsimportModelfrompynamodb.attributesimportUnicodeAttributeclassUserModel(Model):"""
    A DynamoDB User
    """classMeta:table_name="dynamodb-user"host="http://localhost:8000"email=UnicodeAttribute(null=True)first_name=UnicodeAttribute(range_key=True)last_name=UnicodeAttribute(hash_key=True)Want to enable streams on a table? Just add astream_view_typename attribute and specify
the type of data you’d like to stream.frompynamodb.modelsimportModelfrompynamodb.attributesimportUnicodeAttributefrompynamodb.constantsimportSTREAM_NEW_AND_OLD_IMAGEclassAnimalModel(Model):"""
    A DynamoDB Animal
    """classMeta:table_name="dynamodb-user"host="http://localhost:8000"stream_view_type=STREAM_NEW_AND_OLD_IMAGEtype=UnicodeAttribute(null=True)name=UnicodeAttribute(range_key=True)id=UnicodeAttribute(hash_key=True)FeaturesPython >= 3.7 supportAn ORM-like interface with query and scan filtersCompatible with DynamoDB LocalSupports the entire DynamoDB APISupport for Unicode, Binary, JSON, Number, Set, and UTC Datetime attributesSupport for Global and Local Secondary IndexesProvides iterators for working with queries, scans, that are automatically paginatedAutomatic pagination for bulk operationsComplex queriesBatch operations with automatic paginationIterators for working with Query and Scan operations