On 5/29/2010 11:59 AM, nospam wrote:
I'm trying to make the below logic into 1 query, so I don't have to
run an individual query for each item; but can't figure out how to do
it in sqlalchemy.  Any ideas what the code would look like?

results = []

items = session.query(Item).filter(Item.type == "person")

for item in items
   annotations = session.query(Annotation)
        .filter(Annotation.item_id == item.id)
        .order_by(Annotation.creation_datetime.desc())

   annotationResult = None

   for annotation in annotations:
      if annotation.type == "x" or annotation.type == "y"
        annotationResult = annotation
        break;
   if annoationResult == None
        annotationResult = annotations[0]

   results.append(annotationResult)

return results
In my mind the final code would look like this:

def your_function():
    results = []
    session = Session()

    for item in session.query(Item).filter(Item.type == 'person'):
        annotation_result = None
        for annotation in item.annotations:
            if annotation.type in ('x', 'y'):
                annotation_result = annotation
                break
        if annotation_result is None and item.annotations:
            annotation_result = item.annotations[0]
        if annotation_result:
            results.append(annotation_result)

    session.expunge_all()
    session.close()
    return results

But of course that assumes that some relationship mapping has been done ahead of time, for instance:

import sqlalchemy as sa
from sqlalchemy import orm

metadata = sa.MetaData()

items = sa.Table(
    'items', metadata,
    sa.Column('id', sa.Integer, primary_key=True),
    sa.Column('type', sa.String(20)),
    )

annotations = sa.Table(
    'annotations', metadata,
    sa.Column('id', sa.Integer, primary_key=True),
    sa.Column('item_id', sa.Integer, sa.ForeignKey('items.id')),
    sa.Column('type', sa.String(1)),
    sa.Column('creation_datetime', sa.DateTime),
    )

class Item(object):
    pass

class Annotation(object):
    pass

orm.mapper(
    Item, items,
    properties = dict(
annotations = orm.relation(Annotation, order_by=[annotations.c.creation_datetime.desc()]),
        ),
    )

orm.mapper(
    Annotation, annotations,
    )

Session = orm.sessionmaker()

Hope this helps.

Lance

--
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to sqlalch...@googlegroups.com.
To unsubscribe from this group, send email to 
sqlalchemy+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en.

Reply via email to