Skip to content

Instantly share code, notes, and snippets.

@mcdonc
Created February 12, 2011 19:47
Show Gist options
  • Save mcdonc/824045 to your computer and use it in GitHub Desktop.
Save mcdonc/824045 to your computer and use it in GitHub Desktop.
nonglobal sessions, no dbsession attached to request
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