ive committed two fixes related to this issue in 1721. the compilation of mappers has been changed to better handle a circular relationship like the one in your test program (the relationship from Employee to Manager is circular, since a Manager is an Employee). Also there is an explicit error message raised if you try to create an eager relationship for a circular relationship, since eager loading doesnt really support that scenario.
id like to say mapper compilation works completely now but that would be like the third or fourth time im saying it....so, lets just say we're another few inches down the road :) . On Jul 18, 2006, at 7:01 PM, Sol wrote: > Michael Bayer wrote: >> for this program, move the "managers" property after the >> compilation of >> the other mappers: >> >> person_mapper.compile() >> person_mapper.add_property('managers', relation(Manager, >> secondary=people_managers, lazy=False)) >> >> this is a workaround for this particular issue. > > For sqlite it works now. But if i choose to use a postgresql > database i > will only be able to select employees, others will fail. > > e. g. > >>>> from polymorphic import * >>>> session.query(Manager).select() > ... > ... > SQLError: (ProgrammingError) relation "anon_d9b1" does not exist > > > Thanks for your help so far:) > > Cheers, Sol. > from sqlalchemy import * > > db = create_engine('sqlite:///sqlite_base') > #db = create_engine('postgres:///satest') > metadata = BoundMetaData(db) > > session = create_session() > > class Employee(object): > def __init__(self, name): > self.name = name > def __repr__(self): > return self.__class__.__name__ + " " + self.name > > class Manager(Employee): > def __init__(self, name, manager_data): > self.name = name > self.manager_data = manager_data > def __repr__(self): > return self.__class__.__name__ + " " + self.name + " " + > self.manager_data > > class Engineer(Employee): > def __init__(self, name, engineer_info): > self.name = name > self.engineer_info = engineer_info > def __repr__(self): > return self.__class__.__name__ + " " + self.name + " " + > self.engineer_info > > > people = Table('people', metadata, > Column('person_id', Integer, primary_key=True), > Column('name', String(50)), > Column('type', String(30))) > > engineers = Table('engineers', metadata, > Column('person_id', Integer, ForeignKey('people.person_id'), > primary_key=True), > Column('engineer_info', String(50)), > ) > > managers = Table('managers', metadata, > Column('person_id', Integer, ForeignKey('people.person_id'), > primary_key=True), > Column('manager_data', String(50)), > ) > > people_managers = Table('people_managers', metadata, > Column('person_id', Integer, ForeignKey("people.person_id")), > Column('manager_id', Integer, ForeignKey("managers.person_id")) > ) > > person_join = polymorphic_union( { > 'engineer':people.join(engineers), > 'manager':people.join(managers), > 'person':people.select(people.c.type=='person'), > }, None, 'pjoin') > > > > > person_mapper = mapper(Employee, people, select_table=person_join, > polymorphic_on=person_join.c.type, polymorphic_identity='person', > #properties = dict(managers = relation(Manager, > secondary=people_managers, lazy=False)) > ) > > > > engineer_mapper = mapper(Engineer, engineers, > inherits=person_mapper, polymorphic_identity='engineer') > manager_mapper = mapper(Manager, managers, inherits=person_mapper, > polymorphic_identity='manager') > > person_mapper.compile() > person_mapper.add_property('managers', relation(Manager, > secondary=people_managers, lazy=False)) > > def create_some_employees(): > people.create() > engineers.create() > managers.create() > people_managers.create() > session.save(Manager('Tom', 'knows how to manage things')) > session.save(Engineer('Kurt', 'knows how to hack')) > session.flush() > > create_some_employees() > > ---------------------------------------------------------------------- > --- > Take Surveys. Earn Cash. Influence the Future of IT > Join SourceForge.net's Techsay panel and you'll get the chance to > share your > opinions on IT & business topics through brief surveys -- and earn > cash > http://www.techsay.com/default.php? > page=join.php&p=sourceforge&CID=DEVDEV________________________________ > _______________ > Sqlalchemy-users mailing list > Sqlalchemy-users@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/sqlalchemy-users ------------------------------------------------------------------------- Take Surveys. Earn Cash. Influence the Future of IT Join SourceForge.net's Techsay panel and you'll get the chance to share your opinions on IT & business topics through brief surveys -- and earn cash http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV _______________________________________________ Sqlalchemy-users mailing list Sqlalchemy-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/sqlalchemy-users