Skip to main content

helper utility for repository pattern of PofEAA

Project description

.. contents::

.. image:: https://travis-ci.org/rebeccaframework/rebecca.repository.png?branch=master
:target: https://travis-ci.org/rebeccaframework/rebecca.repository

rebecca.repository
===========================

An implementation of repository pattern for SQLAlchemy.


Getting Started
-------------------------------

install by pip::

$ pip install rebecca.repository


Implement your model by SQLAlchemy::

from sqlalchemy import Column, Integer, Unicode
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()
DBSession = scoped_session(sessionmaker())

class Person(Base):
__tablename__ = "person"
id = Column(Integer, primary_key=True)
name = Column(Unicode(255))
age = Column(Integer, default=0)
job = Column(Unicode(255))

Get repository::

from rebecca.repository.sqla import SQLARepository

person_repository = SQALRepository(Person, Person.id, DBSession())

this repository for Person model.
To get person, use Person.id as key.

repository interface
---------------------------------------

create object for demonstration::

person1 = Person(name=u"person1")
DBSession.add(person1)
DBSession.flush() # to generate person.id


A repository has dict like interface::

person_repository[person.id]
person_repository.get(person.id)

and utility methods::

person_repository.get_many([1, 2, 3])
new_person = person_repository.new_item()

conditional repository
------------------------------------------

repository can configure to set condition::

person_repository = SQALRepository(Person, Person.id, DBSession(), condition=Person.age>30)


pyramid integration
----------------------------------------------

rebecca.repository provides directive for pyramid registry.::

config.include('rebecca.repository')
config.add_repository(person_repository, 'person')

or using repository_config decorator::

@repository_config(name="person", args=(DBSession,))
class PersonRepository(SQLARepository):
def __init__(self, dbsession):
super(PersonRepository, self).__init__(Person, Person.id, dbsession)

To get registered repositories, use get_repository::

get_repository(request, 'person')


repository factory
---------------------------------------------------------

If you pass the parameters during request time, use factory.

::

class JobPersonRepository(SQLARepository):
def __init__(self, db_session, job):
super(JobPersonRepository, self).__init__(Person, Person.id, dbsession,
condition=Person.job==job)


The parameter ``job`` will be passed from request attribute.

To register repository factory, add_repository_factory directive::

config.add_repository_factory(JobPersonRepository, "job-person", args=(DBSession,))

or repository_factory_config decorator::

@repository_factory_config("job-person", args=(DBSession,))
class JobPersonRepository(SQLARepository):
....


To create repository from registered factory, call create_repository API::

job = request.matchdict["job"]
repository = create_repository("person", args=(job,))
Contributors
============

- Atsushi Odagiri, Original Author

Changelog
=========

0.3 (2013-08-29)
--------------------------

- added repository factory API
- added get_many method

0.2 (2013-08-25)
-----------------------

- added pyramid config directive and venusian decorator

0.1.1 (2013-08-24)
-----------------------

- fix packaging bug

0.1 (2013-08-24)
-----------------------

- first 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

rebecca.repository-0.3.zip (10.8 kB view hashes)

Uploaded Source

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