summaryrefslogtreecommitdiff
path: root/test/orm/inheritance5.py
diff options
context:
space:
mode:
Diffstat (limited to 'test/orm/inheritance5.py')
-rw-r--r--test/orm/inheritance5.py135
1 files changed, 135 insertions, 0 deletions
diff --git a/test/orm/inheritance5.py b/test/orm/inheritance5.py
new file mode 100644
index 000000000..e54bcb8c8
--- /dev/null
+++ b/test/orm/inheritance5.py
@@ -0,0 +1,135 @@
+from sqlalchemy import *
+import testbase
+
+class AttrSettable(object):
+ def __init__(self, **kwargs):
+ [setattr(self, k, v) for k, v in kwargs.iteritems()]
+ def __repr__(self):
+ return self.__class__.__name__ + ' ' + ','.join(["%s=%s" % (k,v) for k, v in self.__dict__.iteritems() if k[0] != '_'])
+
+
+class RelationTest1(testbase.PersistTest):
+ """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('manager_id', Integer, ForeignKey('managers.person_id', use_alter=True, name="mpid_fq")),
+ 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)),
+ Column('manager_name', String(50))
+ )
+
+ metadata.create_all()
+
+ def tearDownAll(self):
+ metadata.drop_all()
+
+ def tearDown(self):
+ clear_mappers()
+ people.update().execute(manager_id=None)
+ for t in metadata.table_iterator(reverse=True):
+ t.delete().execute()
+
+ def testbasic(self):
+ class Person(AttrSettable):
+ pass
+ class Manager(Person):
+ pass
+
+ mapper(Person, people, properties={
+ 'manager':relation(Manager, primaryjoin=people.c.manager_id==managers.c.person_id, uselist=False)
+ })
+ mapper(Manager, managers, inherits=Person, inherit_condition=people.c.person_id==managers.c.person_id)
+ try:
+ compile_mappers()
+ except exceptions.ArgumentError, ar:
+ assert str(ar) == "Cant determine relation direction for 'manager' on mapper 'Mapper|Person|people' with primary join 'people.manager_id = managers.person_id' - foreign key columns are present in both the parent and the child's mapped tables. Specify 'foreignkey' argument."
+
+ clear_mappers()
+
+ mapper(Person, people, properties={
+ 'manager':relation(Manager, primaryjoin=people.c.manager_id==managers.c.person_id, foreignkey=people.c.manager_id, uselist=False, post_update=True)
+ })
+ mapper(Manager, managers, inherits=Person, inherit_condition=people.c.person_id==managers.c.person_id)
+
+ session = create_session()
+ p = Person(name='some person')
+ m = Manager(name='some manager')
+ p.manager = m
+ session.save(p)
+ session.flush()
+ session.clear()
+
+ p = session.query(Person).get(p.person_id)
+ m = session.query(Manager).get(m.person_id)
+ print p, m, p.manager
+ assert p.manager is m
+
+class RelationTest2(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('name', String(50)),
+ Column('type', String(30)))
+
+ managers = Table('managers', metadata,
+ Column('person_id', Integer, ForeignKey('people.person_id'), primary_key=True),
+ Column('manager_id', Integer, ForeignKey('people.person_id')),
+ 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 testbasic(self):
+ class Person(AttrSettable):
+ pass
+ class Manager(Person):
+ pass
+
+ poly_union = polymorphic_union({
+ 'person':people.select(people.c.type=='person'),
+ 'manager':managers.join(people, people.c.person_id==managers.c.person_id)
+ }, None)
+
+ mapper(Person, people, select_table=poly_union, polymorphic_identity='person', polymorphic_on=people.c.type)
+ mapper(Manager, managers, inherits=Person, inherit_condition=people.c.person_id==managers.c.person_id, polymorphic_identity='manager',
+ properties={
+ 'colleague':relation(Person, primaryjoin=managers.c.manager_id==people.c.person_id, uselist=False)
+ })
+
+ sess = create_session()
+ p = Person(name='person1')
+ m = Manager(name='manager1')
+ m.colleague = p
+ sess.save(m)
+ sess.flush()
+
+ sess.clear()
+ p = sess.query(Person).get(p.person_id)
+ m = sess.query(Manager).get(m.person_id)
+ print p
+ print m
+ assert m.colleague is p
+
+if __name__ == "__main__":
+ testbase.main()
+ \ No newline at end of file