diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2007-01-23 04:05:07 +0000 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2007-01-23 04:05:07 +0000 |
commit | 30f75c2157478480c54ca65d2a00ec1ed6a8820e (patch) | |
tree | c94aa42baccc2d5bef90bd2e3084aa2a930f4b90 /test/orm/inheritance5.py | |
parent | caabadf86666256d1626b84e512fd66bad52fb50 (diff) | |
download | sqlalchemy-30f75c2157478480c54ca65d2a00ec1ed6a8820e.tar.gz |
relationships no longer compile against the "selectable" mapper (i.e. the polymorphic mapper). join conditions, foreign keys etc. are configured against the actual mappers used in the relationship in all cases. the lazy and eager loaders in turn "adapt" their lazy/eager clauses to that of the "selectable" mapper if one is present. this is because the join conditions between the mapper's base tables are *far* easier to work with and detect direction etc. compared to an enormous polymorphic union; dealing with the polymorphic union is pushed further out into select query construction.
Diffstat (limited to 'test/orm/inheritance5.py')
-rw-r--r-- | test/orm/inheritance5.py | 67 |
1 files changed, 65 insertions, 2 deletions
diff --git a/test/orm/inheritance5.py b/test/orm/inheritance5.py index e54bcb8c8..7d59c5d54 100644 --- a/test/orm/inheritance5.py +++ b/test/orm/inheritance5.py @@ -99,7 +99,7 @@ class RelationTest2(testbase.AssertMixin): for t in metadata.table_iterator(reverse=True): t.delete().execute() - def testbasic(self): + def testrelationonsubclass(self): class Person(AttrSettable): pass class Manager(Person): @@ -115,7 +115,7 @@ class RelationTest2(testbase.AssertMixin): properties={ 'colleague':relation(Person, primaryjoin=managers.c.manager_id==people.c.person_id, uselist=False) }) - + class_mapper(Person).compile() sess = create_session() p = Person(name='person1') m = Manager(name='manager1') @@ -130,6 +130,69 @@ class RelationTest2(testbase.AssertMixin): print m assert m.colleague is p +class RelationTest3(testbase.AssertMixin): + """test self-referential relationships on polymorphic mappers""" + def setUpAll(self): + global people, managers, metadata + metadata = BoundMetaData(testbase.db) + + people = Table('people', metadata, + Column('person_id', Integer, Sequence('person_id_seq', optional=True), primary_key=True), + Column('colleague_id', Integer, ForeignKey('people.person_id')), + Column('name', String(50)), + Column('type', String(30))) + + managers = Table('managers', metadata, + Column('person_id', Integer, ForeignKey('people.person_id'), primary_key=True), + Column('status', String(30)), + ) + + metadata.create_all() + + def tearDownAll(self): + metadata.drop_all() + + def tearDown(self): + clear_mappers() + for t in metadata.table_iterator(reverse=True): + t.delete().execute() + + def testrelationonbaseclass(self): + class Person(AttrSettable): + pass + class Manager(Person): + pass + + poly_union = polymorphic_union({ + 'manager':managers.join(people, people.c.person_id==managers.c.person_id), + 'person':people.select(people.c.type=='person') + }, None) + + mapper(Person, people, select_table=poly_union, polymorphic_identity='person', polymorphic_on=people.c.type, + properties={ + 'colleagues':relation(Person, primaryjoin=people.c.colleague_id==people.c.person_id, + remote_side=people.c.person_id, uselist=True) + } + ) + mapper(Manager, managers, inherits=Person, inherit_condition=people.c.person_id==managers.c.person_id, polymorphic_identity='manager') + + sess = create_session() + p = Person(name='person1') + p2 = Person(name='person2') + m = Manager(name='manager1') + p.colleagues.append(p2) + m.colleagues.append(p2) + sess.save(m) + sess.save(p) + sess.flush() + + sess.clear() + p = sess.query(Person).get(p.person_id) + p2 = sess.query(Person).get(p2.person_id) + print p, p2, p.colleagues + assert len(p.colleagues) == 1 + assert p.colleagues == [p2] + if __name__ == "__main__": testbase.main()
\ No newline at end of file |