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.

Reply via email to