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 [email protected].
> To unsubscribe from this group, send email to
> [email protected].
> 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 [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/sqlalchemy?hl=en.