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.