Hi Simon -

yeah that looks pretty buglike to me, mapper.order_by is not a frequently used 
feature so this one may need some adjustment.

I've created http://www.sqlalchemy.org/trac/ticket/2287 to take a look at this 
and so far I'm targeting it at 0.6.9/0.7.3.


On Sep 27, 2011, at 7:29 AM, King Simon-NFHD78 wrote:

> Hi,
> 
> I think there may be a bug in the interaction between 'subqueryload' and
> having a default 'order_by' defined on a mapped class. When the subquery
> is run, it looks like the ORDER BY is being placed on the outer query,
> whereas it should be on the inner query. The full test case is below,
> but here are the 2 queries (produced using hg revision 62e97372a028):
> 
> Main query
> ----------
> SELECT master.id AS master_id, master.dummy AS master_dummy
> FROM master
> ORDER BY master.id DESC
> LIMIT 2 OFFSET 0
> 
> 
> Subquery
> --------
> SELECT detail.id AS detail_id, detail.master_id AS detail_master_id,
> anon_1.master_id AS anon_1_master_id
> FROM (SELECT master.id AS master_id
>      FROM master
>      LIMIT 2 OFFSET 0) AS anon_1
> JOIN detail ON anon_1.master_id = detail.master_id
> ORDER BY anon_1.master_id
> 
> 
> Since the ORDER BY is not on the inner query, a different set of
> 'master' rows is referenced than in the main query.
> 
> Cheers,
> 
> Simon
> 
> --------------------------------------------------------------------
> 
> import sqlalchemy as sa
> import sqlalchemy.orm as saorm
> 
> from sqlalchemy.ext.declarative import declarative_base
> 
> Base = declarative_base()
> 
> class Master(Base):
>    __tablename__ = 'master'
>    id = sa.Column(sa.Integer, primary_key=True, autoincrement=True)
>    dummy = sa.Column(sa.Integer)
>    __mapper_args__ = {'order_by': sa.desc(id)}
> 
> class Detail(Base):
>    __tablename__ = 'detail'
>    id = sa.Column(sa.Integer, primary_key=True, autoincrement=True)
>    master_id = sa.Column(sa.Integer, sa.ForeignKey(Master.id))
>    master = saorm.relationship(Master, backref='details')
> 
> def test():
>    dburi = 'sqlite://'
>    engine = sa.create_engine(dburi, echo=True)
>    Base.metadata.drop_all(bind=engine)
>    Base.metadata.create_all(bind=engine)
>    session = saorm.create_session(bind=engine)
> 
>    session.begin()
>    # Insert 5 masters, each with 1 detail
>    for i in range(5):
>        master = Master(dummy=i)
>        master.details.append(Detail())
>        session.add(master)
>    session.commit()
>    session.close()
> 
>    # Load back 2 masters, using subqueryload to load the detail
>    # rows. If you uncomment the '.order_by' line here, the test
>    # passes.
>    master_query = (session.query(Master)
>                    #.order_by(sa.desc(Master.id))
>                    .limit(2)
>                    .options(saorm.subqueryload('details')))
> 
>    # Display the details for each master
>    for item in master_query:
>        print 'Master %s: %s' % (item.id, item.details),
>        if len(item.details) == 0:
>            print 'FAIL'
>        else:
>            print 'PASS'
> 
> if __name__ == '__main__':
>    test()
> 
> 
> -- 
> 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.
> 

-- 
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.

Reply via email to