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()

Reply via email to