Created
February 12, 2011 19:47
-
-
Save mcdonc/824045 to your computer and use it in GitHub Desktop.
nonglobal sessions, no dbsession attached to request
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import transaction | |
from sqlalchemy.ext.declarative import declarative_base | |
from sqlalchemy.exc import IntegrityError | |
from sqlalchemy.orm.session import object_session | |
from sqlalchemy import Integer | |
from sqlalchemy import Unicode | |
from sqlalchemy import Column | |
Base = declarative_base() | |
class MyModel(Base): | |
__tablename__ = 'models' | |
id = Column(Integer, primary_key=True) | |
name = Column(Unicode(255), unique=True) | |
value = Column(Integer) | |
def __init__(self, name, value): | |
self.name = name | |
self.value = value | |
@property | |
def _session(self): | |
return object_session(self) | |
class MyRoot(object): | |
__name__ = None | |
__parent__ = None | |
def __init__(self, session): | |
self.session = session | |
def __getitem__(self, key): | |
session = self.session | |
try: | |
id = int(key) | |
except (ValueError, TypeError): | |
raise KeyError(key) | |
item = session.query(MyModel).get(id) | |
if item is None: | |
raise KeyError(key) | |
item.__parent__ = self | |
item.__name__ = key | |
return item | |
def get(self, key, default=None): | |
try: | |
item = self.__getitem__(key) | |
except KeyError: | |
item = default | |
return item | |
def __iter__(self): | |
session= self.session | |
query = session.query(MyModel) | |
return iter(query) | |
def root_factory(request): | |
session = request.registry.settings['db.sessionmaker']() | |
root = MyRoot(session) | |
return root | |
def populate(session): | |
try: | |
model = MyModel(name=u'test name', value=55) | |
session.add(model) | |
session.flush() | |
transaction.commit() | |
except IntegrityError: | |
session.rollback() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment