Skip to main content

SQLAlchemy-style ORM for Amazon's DynamoDB

Project description

Flywheel
========
:Master Build: |build|_ |coverage|_
:0.2 Build: |build-0.2|_ |coverage-0.2|_
:0.3 Build: |build-0.3|_ |coverage-0.3|_
:Documentation: http://flywheel.readthedocs.org/
:Downloads: http://pypi.python.org/pypi/flywheel
:Source: https://github.com/mathcamp/flywheel

.. |build| image:: https://travis-ci.org/mathcamp/flywheel.png?branch=master
.. _build: https://travis-ci.org/mathcamp/flywheel
.. |coverage| image:: https://coveralls.io/repos/mathcamp/flywheel/badge.png?branch=master
.. _coverage: https://coveralls.io/r/mathcamp/flywheel?branch=master

.. |build-0.2| image:: https://travis-ci.org/mathcamp/flywheel.png?branch=0.2
.. _build-0.2: https://travis-ci.org/mathcamp/flywheel
.. |coverage-0.2| image:: https://coveralls.io/repos/mathcamp/flywheel/badge.png?branch=0.2
.. _coverage-0.2: https://coveralls.io/r/mathcamp/flywheel?branch=0.2

.. |build-0.3| image:: https://travis-ci.org/mathcamp/flywheel.png?branch=0.3
.. _build-0.3: https://travis-ci.org/mathcamp/flywheel
.. |coverage-0.3| image:: https://coveralls.io/repos/mathcamp/flywheel/badge.png?branch=0.3
.. _coverage-0.3: https://coveralls.io/r/mathcamp/flywheel?branch=0.3

Object mapper for Amazon's DynamoDB

Getting Started
===============
This is what a basic model looks like (schema taken from this `DynamoDB
API documentation
<http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GSI.html>`_)
::

from flywheel import Model, Field, GlobalIndex

class GameScore(Model):
__metadata__ = {
'global_indexes': [
GlobalIndex('GameTitleIndex', 'title', 'top_score')
],
}
userid = Field(hash_key=True)
title = Field(range_key=True)
top_score = Field(data_type=int)
top_score_time = Field(data_type=datetime)
wins = Field(data_type=int)
losses = Field(data_type=int)

def __init__(self, title, userid):
self.title = title
self.userid = userid

Create a new top score::

>>> score = GameScore('Master Blaster', 'abc')
>>> score.top_score = 9001
>>> score.top_score_time = datetime.utcnow()
>>> engine.sync(score)

Get all top scores for a user::

>>> scores = engine.query(GameScore).filter(userid='abc').all()

Get the top score for Galaxy Invaders::

>>> top_score = engine.query(GameScore).filter(title='Galaxy Invaders')\
... .first(desc=True)

Atomically increment a user's "wins" count on Alien Adventure::

>>> score = GameScore('Alien Adventure', 'abc')
>>> score.incr_(wins=1)
>>> engine.sync(score)

Get all scores on Comet Quest that are over 9000::

>>> scores = engine.query(GameScore).filter(GameScore.top_score > 9000,
... title='Comet Quest').all()


Changelog
=========
0.4.0
-----
* **Breakage**: Dropping support for python 3.2 due to lack of botocore support
* **Breakage**: Changing the ``list``, ``dict``, and ``bool`` data types to use native DynamoDB types instead of JSON serializing
* **Breakage** and bug fix: Fixing serialization of ``datetime`` and ``date`` objects (for more info see the commit)
* Feature: Can now do 'contains' filters on lists
* Feature: Fields support multiple validation checks
* Feature: Fields have an easy way to enforce non-null values (``nullable=False``)

Data type changes are due to an `update in the DynamoDB API
<https://aws.amazon.com/blogs/aws/dynamodb-update-json-and-more/>`_

0.3.0
-----
* **Breakage**: Engine namespace is slightly different. If you pass in a string it will be used as the table name prefix with no additional '-' added.

0.2.1
-----
* **Breakage**: Certain queries may now require you to specify an index where it was auto-detected before
* Feature: Queries can now filter on non-indexed fields
* Feature: More powerful "sync-if" constraints
* Feature: Can OR together filter constraints in queries

All changes are due to an `update in the DynamoDB API
<http://aws.amazon.com/blogs/aws/improved-queries-and-updates-for-dynamodb/>`_

0.2.0
-----
* **Breakage**: Engine no longer accepts boto connections (using dynamo3 instead)
* **Breakage**: Removing S3Type (no longer have boto as dependency)
* Feature: Support Python 3.2 and 3.3
* Feature: ``.count()`` terminator for queries
* Feature: Can override throughputs in ``Engine.create_schema()``
* Bug fix: Engine ``namespace`` is truly isolated

0.1.3
-----
* Bug fix: Some queries fail when global index has no range key

0.1.2
-----
* Bug fix: Field names can begin with an underscore
* Feature: Models have a nice default __init__ method

0.1.1
-----
* Bug fix: Can call ``incr_()`` on models that have not been saved yet
* Bug fix: Model comparison with ``None``

0.1.0
-----
* First public release

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

flywheel-0.4.0.tar.gz (26.9 kB view details)

Uploaded Source

Built Distribution

flywheel-0.4.0-py2.py3-none-any.whl (32.4 kB view details)

Uploaded Python 2 Python 3

File details

Details for the file flywheel-0.4.0.tar.gz.

File metadata

  • Download URL: flywheel-0.4.0.tar.gz
  • Upload date:
  • Size: 26.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for flywheel-0.4.0.tar.gz
Algorithm Hash digest
SHA256 6778489c0248ce6996ec3051a719da89642752e3c43cb6689410c9668ac1d443
MD5 5838ef4321da18161401dc74139f739f
BLAKE2b-256 1f2fbe4096d219bd24b5dede63eec59b7322f33716f335ad68719324a230d1f8

See more details on using hashes here.

File details

Details for the file flywheel-0.4.0-py2.py3-none-any.whl.

File metadata

File hashes

Hashes for flywheel-0.4.0-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 30e17b59a3a744cab1e434eb6eeba092229a5596bc0f3334625eb7295cf5c768
MD5 c4d54488a5b2cd30191871b05874431a
BLAKE2b-256 df6bb5b86f502780be6c8252581e119f294ac0c0515a04a6df435d714c030c50

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page