ripozo-sqlalchemy

December 22, 2015 ยท View on GitHub

.. image:: https://travis-ci.org/vertical-knowledge/ripozo-sqlalchemy.svg?branch=master&style=flat :target: https://travis-ci.org/vertical-knowledge/ripozo-sqlalchemy :alt: test status

.. image:: https://coveralls.io/repos/vertical-knowledge/ripozo-sqlalchemy/badge.svg?branch=master&style=flat :target: https://coveralls.io/r/vertical-knowledge/ripozo-sqlalchemy?branch=master :alt: test coverage

.. image:: https://readthedocs.org/projects/ripozo-sqlalchemy/badge/?version=latest&style=flat :target: https://ripozo-sqlalchemy.readthedocs.org/ :alt: Documentation Status

.. .. image:: https://pypip.in/version/ripozo-sqlalchemy/badge.svg?style=flat :target: https://pypi.python.org/pypi/ripozo-sqlalchemy/ :alt: current version

.. image:: https://pypip.in/d/ripozo-sqlalchemy/badge.png?style=flat
    :target: https://crate.io/packages/ripozo-sqlalchemy/
    :alt: Number of PyPI downloads

.. image:: https://pypip.in/py_versions/ripozo-sqlalchemy/badge.svg?style=flat
    :target: https://pypi.python.org/pypi/ripozo-sqlalchemy/
    :alt: python versions

This package is a ripozo extension that provides a Manager that integrate SQLAlchemy with ripozo. It provides convience functions for generating resources. In particular, it focuses on creating shortcuts for CRUD type operations. It fully implements the BaseManager_ class that is provided in the ripozo_ package.

Full Documentation <http://ripozo-sqlalchemy.readthedocs.org/en/latest/>_

Example

This is a minimal example of creating ripozo managers with ripozo-sqlalchemy and integrating them with a resource.

First we need to setup our SQLAlchemy model.

.. code-block:: python

from ripozo import apimethod, ResourceBase

from sqlalchemy import Column, Integer, String, create_engine
from sqlalchemy.ext.declarative import declarative_base

# Setup the database with sqlalchemy
engine = create_engine('sqlite:///:memory:', echo=True)
Base = declarative_base()

# Declare your ORM model
class Person(Base):
    __tablename__ = 'person'
    id = Column(Integer, primary_key=True)
    first_name = Column(String)
    last_name = Column(String)
    
# Sync the models wiht the database
Base.metadata.create_all()

Now we can get to the ripozo-sqlalchemy part.

.. code-block:: python

from ripozo_sqlalchemy import AlchemyManager, ScopedSessionHandler

# A session handler if responsible for getting
# And handling a session after either a successful or unsuccessful request
session_handler = ScopedSessionHandler(engine)

# This is the code that is specific to ripozo-sqlalchemy
# You give it the session, a SQLAlchemy Model, and the fields
# You wish to serialize at a minimum.
class PersonManager(AlchemyManager):
    model = Person
    fields = ('id', 'first_name', 'last_name')
    
    
# This is the ripozo specific part.
# This creates a resource class that can be given
# to a dispatcher (e.g. the flask-ripozo package's FlaskDispatcher)
class PersonResource(ResourceBase):
    manager = PersonManager(session_handler)
    pks = ['id']
    namespace = '/api'
    
    # A retrieval method that will operate on the '/api/person/<id>' route
    # It retrieves the id, first_name, and last_name properties for the
    # resource as identified by the url parameter id.
    @apimethod(methods=['GET'])
    def get_person(cls, request):
        properties = cls.manager.retrieve(request.url_params)
        return cls(properties=properties)
        

Easy Resources ^^^^^^^^^^^^^^

Alternatively, we could use the create_resource method which will automatically create a manager and resource that corresponds to the manager.

.. code-block:: python

from ripozo import restmixins
from ripozo_sqlalchemy import ScopedSessionHandler, create_resource

session_handler = ScopedSessionHandler(engine)
PersonResource = create_resource(Person, session_handler)

By default create_resource will give you full CRUD+L (Create, Retrieve, Update, Delete, List). Although there are many options that you can pass to create_resource to modify exactly how the resource class is constructed.

After you create your resource class, you will need to load it into a dispatcher corresponding to your framework. For example, in flask-ripozo

.. code-block:: python

from flask import Flask
from flask_ripozo import FlaskDispatcher
from ripozo.adapters import SirenAdapter, HalAdapter # These are the potential formats to return

app = Flask(__name__)
dispatcher = FlaskDispatcher(app)
dispatcher.register_adapters(SirenAdapter, HalAdapter)
dispatcher.register_resources(PersonResource)

app.run()

.. _BaseManager: https://ripozo.readthedocs.org/en/latest/API/ripozo.managers.html#ripozo.managers.base.BaseManager

.. _ripozo: https://ripozo.readthedocs.org/