SQLAlchemy-style ORM for Amazon's DynamoDB
Project description
Flywheel
========
:Build: |build|_ |coverage|_
: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
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.5
-----
* Bug fix: Calling refresh() could sometimes crash from unordered results.
0.4.4
-----
* Bug fix: Mutable field defaults are no longer shared among model instances
0.4.3
-----
* Bug fix: Incorrect ``ConditionalCheckFailedException`` when syncing changes to a Composite field.
* Allow ``DateTimeType`` to be stored as a naive datetime.
0.4.2
-----
* Make the ``dict``, ``list``, and ``bool`` types backwards-compatible with the old json-serialized format
* Allow queries to use ``in``, ``not null``, and a few other constraints that were missing
* Models are smarter about marking fields as dirty for sync
* Stopped using deprecated ``expected`` syntax for dynamo3
0.4.1
-----
* **Warning**: Stored datetime objects will now be timezone-aware
* **Warning**: Stored datetime objects will now keep their microseconds
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
========
:Build: |build|_ |coverage|_
: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
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.5
-----
* Bug fix: Calling refresh() could sometimes crash from unordered results.
0.4.4
-----
* Bug fix: Mutable field defaults are no longer shared among model instances
0.4.3
-----
* Bug fix: Incorrect ``ConditionalCheckFailedException`` when syncing changes to a Composite field.
* Allow ``DateTimeType`` to be stored as a naive datetime.
0.4.2
-----
* Make the ``dict``, ``list``, and ``bool`` types backwards-compatible with the old json-serialized format
* Allow queries to use ``in``, ``not null``, and a few other constraints that were missing
* Models are smarter about marking fields as dirty for sync
* Stopped using deprecated ``expected`` syntax for dynamo3
0.4.1
-----
* **Warning**: Stored datetime objects will now be timezone-aware
* **Warning**: Stored datetime objects will now keep their microseconds
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
Release history Release notifications | RSS feed
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.5.tar.gz
(28.5 kB
view details)
Built Distribution
File details
Details for the file flywheel-0.4.5.tar.gz
.
File metadata
- Download URL: flywheel-0.4.5.tar.gz
- Upload date:
- Size: 28.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | ca9b5aa10fdb1aaf51d1144e34230bd349eec1d1b434159168f126e2529b1b83 |
|
MD5 | 311aef92b411d20db675762d248f946b |
|
BLAKE2b-256 | 38743ec4fdd4c1f51df5473b90a0acdeb6d7d3bde2e68e98b0de5ca50a81f24a |
File details
Details for the file flywheel-0.4.5-py2.py3-none-any.whl
.
File metadata
- Download URL: flywheel-0.4.5-py2.py3-none-any.whl
- Upload date:
- Size: 34.1 kB
- Tags: Python 2, Python 3
- Uploaded using Trusted Publishing? No
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 57336f1d5546497d38a6dfa35a83aa69f3857d01251b618c97ee74b987570900 |
|
MD5 | 5b590c2143ded25afc40a8ac7a0145e0 |
|
BLAKE2b-256 | 93cd083cd48b2d6c66585db62e8aed2810f816b32c520a3392b9784beec12990 |