hi, i hit another dynamic relations related bug. if you remove lazy='dynamic' from items mapping there's no problem.
--~--~---------~--~----~------------~-------~--~----~ 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 [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/sqlalchemy?hl=en -~----------~----~----~----~------~----~------~--~---
from sqlalchemy import * from sqlalchemy.orm import * metadata = MetaData() elements = Table('elements', metadata, Column('id', Integer, primary_key=True), Column('type', String(128)), Column('name', String(256)), ) items = Table('items', metadata, Column('assembly_id', Integer, ForeignKey('elements.id'), primary_key=True), Column('element_id', Integer, ForeignKey('elements.id'), primary_key=True), Column('quantity', Integer, default=1, nullable=False), ) engine = create_engine('sqlite:///') metadata.bind = engine metadata.create_all() class Element(object): def __init__(self, name): self.name = name def __repr__(self): return '<%s %s>' % (self.__class__.__name__, self.name) class Part(Element): pass class Assembly(Element): pass class Product(Assembly): pass class Item(object): def __init__(self, assembly, element, quantity=1): self.assembly = assembly self.element = element self.quantity = quantity def __repr__(self): return '<%s %d %s %s>' % (self.__class__.__name__, self.quantity, self.assembly.name, self.element.name) element_mapper = mapper(Element, elements, polymorphic_on=elements.c.type, polymorphic_identity='element' ) part_mapper = mapper(Part, inherits=element_mapper, polymorphic_identity='part') assembly_mapper = mapper(Assembly, inherits=element_mapper, polymorphic_identity='assembly') product_mapper = mapper(Product, inherits=assembly_mapper, polymorphic_identity='product') items_select = select( [items, elements.c.name], items.c.element_id==elements.c.id ).alias('element_items') items_mapper = mapper(Item, items_select, primary_key=[items_select.c.assembly_id, items_select.c.element_id], order_by=items_select.c.name, properties=dict( assembly=relation( Assembly, lazy=False, uselist=False, foreign_keys=[items_select.c.assembly_id], primaryjoin=items_select.c.assembly_id==elements.c.id, backref=backref('element_items', lazy='dynamic', primaryjoin=items_select.c.assembly_id==elements.c.id), ), element=relation( Element, lazy=False, uselist=False, foreign_keys=[items_select.c.element_id], primaryjoin=items_select.c.element_id==elements.c.id, backref=backref('assembly_items', lazy='dynamic', primaryjoin=items_select.c.element_id==elements.c.id), ), quantity=items_select.c.quantity, ) ) session = create_session(bind=engine) prod1 = Product('prod1') session.save(prod1) part1 = Part('part1') session.save(part1) for i in range(2): assem = Assembly('assem%d' % i) i1 = Item(prod1, assem) i2 = Item(assem, part1) [session.save(o) for o in (assem, i1, i2)] session.flush() session.clear() prod1 = session.query(Product).filter_by(name='prod1').one() print list(prod1.element_items) print prod1.element_items[0] metadata.drop_all()