pofeaa存储库模式的helper实用程序
rebecca.repositor的Python项目详细描述
内容
rebecca.repository
sqlalchemy存储库模式的实现。
Repository for SQLAlchemy
basic repository
通过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))
获取存储库:
from rebecca.repository.sqla import SQLARepository person_repository = SQALRepository(Person, Person.id, DBSession())
此人员模型存储库。 要获取person,请使用person.id作为密钥。
conditional repository
存储库可以配置为设置条件:
person_repository = SQALRepository(Person, Person.id, DBSession(), condition=Person.age>30)
repository factory
如果在请求期间传递参数,请使用factory。
class JobPersonRepository(SQLARepository): def __init__(self, db_session, job): super(JobPersonRepository, self).__init__(Person, Person.id, dbsession, condition=Person.job==job)
参数job将从请求属性传递。
要注册存储库工厂,请添加存储库工厂指令:
config.add_repository_factory(JobPersonRepository, "job-person", args=(DBSession,))
或repository_factory_config decorator:
@repository_factory_config("job-person", args=(DBSession,)) class JobPersonRepository(SQLARepository): ....
要从注册的工厂创建存储库,请调用create_repository api:
job = request.matchdict["job"] repository = create_repository("person", args=(job,))
Repository for Filesystem
rebecca.repository.fs.FileSystemRepository是文件系统的存储库:
>>> repository = FileSystemRepository(directory="/path/to/data") >>> item = repository.new_item("new-item") >>> item.data = b"testing-binary-data" >>> import transaction >>> transaction.commit()
FileSystemRepository.new_item正在创建新的文件系统项。 item.data是保存在文件中的二进制数据。 这与transaction是事务性的。
注意
FileSystemRepository使用的repoze.filesafe还不支持py3k。
repository interface
创建演示对象:
person1 = Person(name=u"person1") DBSession.add(person1) DBSession.flush() # to generate person.id
存储库具有类似dict的界面:
person_repository[person.id] person_repository.get(person.id)
以及实用方法:
person_repository.get_many([1, 2, 3]) new_person = person_repository.new_item()
pyramid integration
repository为金字塔注册表提供了指令。
config.include('rebecca.repository') config.add_repository(person_repository, 'person')
或者使用repository配置装饰符:
@repository_config(name="person", args=(DBSession,)) class PersonRepository(SQLARepository): def __init__(self, dbsession): super(PersonRepository, self).__init__(Person, Person.id, dbsession)
若要获取已注册的存储库,请使用“获取存储库:
get_repository(request, 'person')
Contributors
- Atsushi Odagiri,原作者
Changelog
0.4 (2013-09-22)
- 文件存储库(尚未)
0.3 (2013-08-29)
- 添加了存储库工厂API
- 添加了get_many方法
0.2 (2013-08-25)
- 添加了金字塔配置指令和金星装饰符
0.1.1 (2013-08-24)
- 修复打包错误
0.1 (2013-08-24)
- 首次发布