Re: [sqlalchemy] Re: How to order_by relation by another join?

2010-02-11 Thread Michael Bayer

On Feb 11, 2010, at 6:45 AM, Andrija Zarić wrote:

 Thanks, Mike!
 
 Your example indeed works, but unfortunately when I add inheritance,
 mapper fails to generate proper (inherited) class:
 (I've changed code a little, so it represents more what I'm trying to
 do)

 class ValueItem(Item):
   __mapper_args__ = { 'polymorphic_identity' : 'quantity' }
   value = Column('quantity_value', Numeric(15, 4))
 
 
 class ErrorItem(Item):
   __mapper_args__ = { 'polymorphic_identity' : 'error' }
   value = Column('error_value', String(15, 4))

I'm assuming these are single-table inheritance mappers (I forgot about that 
add the column trick..)

So yeah my solution was a quick hack and to continue in this way you'd have to 
build non-primary mappers for each of ValueItem, ErrorItem that state 
inherits for the original non-primary mapper, using the polymorphic 
identities as well.   It would still work.

If you don't care much about a high-scaling query you could ditch the secondary 
mapper idea and order by a subquery, like

detail_alias = Detail.__table__.alias()
class Order(Base):
items = relation(Item, 
order_by=select([detail_alias.c.id]).where(detail_alias.c.id==Item.__table__.c.detail_id).alias())

again somehting i haven't tried, but should work in theory.




 
 from sqlalchemy import *
 from sqlalchemy.orm import *
 from sqlalchemy.ext.declarative import declarative_base
 
 engine = create_engine('sqlite://', echo=True)
 Base = declarative_base()
 
 class Detail(Base):
   __tablename__ = 'detail'
   id = Column(Integer, primary_key=True)
   sort = Column(Integer)
 
 class Order(Base):
   __tablename__ = 'order'
   id = Column(Integer, primary_key=True)
 
 class Item(Base):
   __tablename__ = 'item'
   id = Column(Integer, primary_key=True)
   order_id = Column(Integer, ForeignKey('order.id'))
   detail_id = Column(Integer, ForeignKey('detail.id'))
 
   detail = relation(Detail, uselist=False, lazy=False)
   order = relation(Order, uselist=False)
   type = Column(String(20))
   __mapper_args__ = { 'polymorphic_on' : type}
 
 
 class ValueItem(Item):
   __mapper_args__ = { 'polymorphic_identity' : 'quantity' }
   value = Column('quantity_value', Numeric(15, 4))
 
 
 class ErrorItem(Item):
   __mapper_args__ = { 'polymorphic_identity' : 'error' }
   value = Column('error_value', String(15, 4))
 
 
 Order.items  = relation(Item)
 j = Item.__table__.join(Detail.__table__)
 itemdetail = mapper(Item, j, non_primary=True)
 Order.sorteditems = relation(itemdetail,
 order_by=Detail.__table__.c.sort, viewonly=True)
 
 metadata = Base.metadata
 metadata.create_all(engine)
 Session = scoped_session(sessionmaker(bind=engine))
 
 order = Order(id=1)
 Session.add(order)
 detail = Detail(id=1, sort=1)
 order.items.append(ValueItem(id=1, detail=detail))
 
 Session.commit()
 
 for order in Session.query(Order).all():
for item in order.sorteditems:
print item
for item in order.items:
print item
 
 ...
 __main__.Item object at 0x881ddac
 
 __main__.ValueItem object at 0x960da6c
 
 
 Am I making a obvious mistake somewhere here?
 
 -- 
 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.
 

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



Re: [sqlalchemy] Re: How to order_by relation by another join?

2010-02-11 Thread Andrija Zarić
On 11 February 2010 14:26, Michael Bayer mike...@zzzcomputing.com wrote:
 I'm assuming these are single-table inheritance mappers (I forgot about that 
 add the column trick..)

 So yeah my solution was a quick hack and to continue in this way you'd have 
 to build non-primary mappers for each of ValueItem, ErrorItem that state 
 inherits for the original non-primary mapper, using the polymorphic 
 identities as well.   It would still work.

Thanks again!

It's obvious now, of course. When I added other non-primary mappers,
inheritance is working. I suppose declarative extension spoiled me...

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