Adding this to the test shows that the generated sql does retrieve 3 rows as expected.
for r in sess.execute(q): print r I suspect it has something to do with the identity mapping. Maybe someone who understands that could help with an explanation. Knowing my data, I could have a similar problem. -- Mike Conley On Sun, Apr 19, 2009 at 2:45 PM, Alessandro Dentella <san...@e-den.it>wrote: > > Hi, > > i'm playing with outerjoin defined in the mapper. I'm getting results > different from what I expected, so that I would like to understand which is > the underline logic. > > Where a Query w/ outerjoin SELECT has in the backend n rows and would have > m > rows in a simple join, I only get m rows plus one 'None' for all the > others. > > I would have thought to get one instance for each output of the query, am I > wrong? > > tanks in advance > sandro > *:-) > > The example: > > from sqlalchemy.ext.declarative import declarative_base > from sqlalchemy import Table, Column, ForeignKey, text, func > from sqlalchemy.types import * > from sqlalchemy.orm import relation, sessionmaker, mapper, column_property > from sqlalchemy.orm.interfaces import SessionExtension > from datetime import datetime, timedelta > > Base = declarative_base() > Base.metadata.bind = 'sqlite://' > Session = sessionmaker(bind=Base.metadata.bind) > sess = Session() > > class Entry(Base): > __tablename__ = 'calendar_entry' # Todo and Events > id = Column(Integer, primary_key=True) > summary = Column(String(100)) > dtstart = Column(DateTime(timezone=False), nullable=False, > index=True) > > class Alarm(Base): > __tablename__ = 'calendar_alarm' > > ida = Column(Integer, primary_key=True) > trigger = Column(Interval, nullable=False) > > # o2m > entry_id = Column(ForeignKey(Entry.id), nullable=False) > entry = relation(Entry, backref='alarm', lazy=True) > > Base.metadata.create_all() > > e1 = Entry(summary="sum1", dtstart=datetime.now()) > e2 = Entry(summary="sum2", dtstart=datetime.now()) > a = Alarm(trigger=timedelta(days=1)) > ea1 = Entry(summary="entry w/ alarm", dtstart=datetime.now(),alarm=[a]) > > > for e in (e1, e2, ea1, a): > sess.add(e) > > sess.commit() > > entry_table = Entry.__table__ > alarm_table = Alarm.__table__ > > class MyJoin(object): > def __str__(self): > return "%s" % self.dtstart > > m = mapper(MyJoin, entry_table.outerjoin(alarm_table), ) > > > q = sess.query(m) > print q.count() > for r in q.all(): > print r > ------------------- with result -------------- > > 3 # count for the matches > None ??? > 2009-04-19 20:34:04.188442 # the only joined entry (entry w/ alarm) > > > > --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To post to this group, send email to sqlalchemy@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 -~----------~----~----~----~------~----~------~--~---