Advertisement
Guest User

Untitled

a guest
Jul 19th, 2011
1,653
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.54 KB | None | 0 0
  1. from sqlalchemy.orm.query import Query
  2. from sqlalchemy.orm.util import _entity_descriptor
  3. from sqlalchemy import util
  4. from sqlalchemy.sql import operators, extract
  5.  
  6. ops = {
  7.     'gt':operators.gt,
  8.     'lt':operators.lt,
  9.     'ge':operators.ge,
  10.     'le':operators.le,
  11.     'contains':operators.contains_op,
  12.     'in':operators.in_op,
  13.     'exact':operators.eq,
  14.     'iexact':operators.ilike_op,
  15.     'startswith':operators.startswith_op,
  16.     'endswith':operators.endswith_op,
  17.     'range':operators.between_op,
  18.     'year': lambda c, x: extract('year', c) == x,
  19.     'month': lambda c, x: extract('month', c) == x,
  20.     'day': lambda c, x: extract('day', c) == x,
  21. }
  22. class DoubleUnderMagicalQuery(Query):
  23.     def filter_by(self, **kw):
  24.         q = self
  25.         for k in kw:
  26.             # the basic idea.   Doesn't check for errors as of yet.
  27.             current = None
  28.             tokens = k.split('__')
  29.             for token in tokens:
  30.                 if current is None:
  31.                     current = _entity_descriptor(q._joinpoint_zero(), token)
  32.                     if current.impl.uses_objects:
  33.                         q = q.join(current)
  34.                         current = None
  35.                 elif token in ops:
  36.                     q = q.filter(ops[token](current, *util.to_list(kw[k])))
  37.                     break
  38.         return q
  39.  
  40. if __name__ == '__main__':
  41.     from sqlalchemy.ext.declarative import declarative_base, declared_attr
  42.     from sqlalchemy import Column, Integer, String, ForeignKey, create_engine, Date
  43.     from sqlalchemy.orm import Session, relationship
  44.     import datetime
  45.  
  46.     class Base(object):
  47.         @declared_attr
  48.         def __tablename__(cls):
  49.             return cls.__name__.lower()
  50.  
  51.         id = Column(Integer, primary_key=True)
  52.  
  53.     Base = declarative_base(cls=Base)
  54.  
  55.     class Blog(Base):
  56.         name = Column(String)
  57.         entries = relationship("Entry", backref="blog")
  58.  
  59.     class Entry(Base):
  60.         blog_id = Column(Integer, ForeignKey('blog.id'))
  61.         date = Column(Date)
  62.         headline = Column(String)
  63.         body = Column(String)
  64.  
  65.     e = create_engine('sqlite://', echo=True)
  66.     Base.metadata.create_all(e)
  67.  
  68.     s = Session(e, query_cls=DoubleUnderMagicalQuery)
  69.  
  70.     b1, b2 = Blog(name='blog1', entries=[
  71.             Entry(headline='b1 headline 1', body='body 1', date=datetime.date(2010, 2, 5)),
  72.             Entry(headline='b1 headline 2', body='body 2', date=datetime.date(2010, 4, 8)),
  73.             Entry(headline='b1 headline 3', body='body 3', date=datetime.date(2010, 9, 14)),
  74.         ]),\
  75.         Blog(name='blog2', entries=[
  76.             Entry(headline='b2 headline 1', body='body 1', date=datetime.date(2010, 5, 12)),
  77.             Entry(headline='b2 headline 2', body='body 2', date=datetime.date(2010, 7, 18)),
  78.             Entry(headline='b2 headline 3', body='body 3', date=datetime.date(2011, 8, 27)),
  79.         ])
  80.  
  81.     s.add_all([b1, b2])
  82.     s.commit()
  83.  
  84. # blog with name of 'blog1'
  85. assert s.query(Blog).filter_by(name__exact='blog1').one() is b1
  86.  
  87. # blog with name  containing 'blog'
  88. assert s.query(Blog).filter_by(name__contains='blog').all() == [b1, b2]
  89.  
  90. # blog with entry 'b2 headline 2'
  91. assert s.query(Blog).filter_by(entries__headline__exact='b2 headline 2').one() is b2
  92.  
  93. # blog with entries between 1/10 - 3/10
  94. assert s.query(Blog).filter_by(
  95.                 entries__date__range=(datetime.date(2010, 1, 1), datetime.date(2010, 3, 1))
  96.                 ).one() is b1
  97.  
  98. # entries in 2011
  99. assert s.query(Entry).filter_by(date__year=2011).one() is b2.entries[2]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement