summaryrefslogtreecommitdiff
path: root/test/orm/inheritance/test_selects.py
diff options
context:
space:
mode:
Diffstat (limited to 'test/orm/inheritance/test_selects.py')
-rw-r--r--test/orm/inheritance/test_selects.py79
1 files changed, 65 insertions, 14 deletions
diff --git a/test/orm/inheritance/test_selects.py b/test/orm/inheritance/test_selects.py
index dd9c8c8b8..94f5faf8f 100644
--- a/test/orm/inheritance/test_selects.py
+++ b/test/orm/inheritance/test_selects.py
@@ -1,50 +1,101 @@
-from sqlalchemy import *
-from sqlalchemy.orm import *
+from sqlalchemy import String, Integer, ForeignKey, select
+from sqlalchemy.orm import mapper, Session
from sqlalchemy import testing
-from sqlalchemy.testing import fixtures
+from sqlalchemy.testing import fixtures, eq_
+from sqlalchemy.testing.schema import Table, Column
class InheritingSelectablesTest(fixtures.MappedTest):
@classmethod
def define_tables(cls, metadata):
- global foo, bar, baz
foo = Table('foo', metadata,
Column('a', String(30), primary_key=1),
Column('b', String(30), nullable=0))
- bar = foo.select(foo.c.b == 'bar').alias('bar')
- baz = foo.select(foo.c.b == 'baz').alias('baz')
+ cls.tables.bar = foo.select(foo.c.b == 'bar').alias('bar')
+ cls.tables.baz = foo.select(foo.c.b == 'baz').alias('baz')
def test_load(self):
+ foo, bar, baz = self.tables.foo, self.tables.bar, self.tables.baz
# TODO: add persistence test also
testing.db.execute(foo.insert(), a='not bar', b='baz')
testing.db.execute(foo.insert(), a='also not bar', b='baz')
testing.db.execute(foo.insert(), a='i am bar', b='bar')
testing.db.execute(foo.insert(), a='also bar', b='bar')
- class Foo(fixtures.ComparableEntity): pass
- class Bar(Foo): pass
- class Baz(Foo): pass
+ class Foo(fixtures.ComparableEntity):
+ pass
+ class Bar(Foo):
+ pass
+ class Baz(Foo):
+ pass
mapper(Foo, foo, polymorphic_on=foo.c.b)
mapper(Baz, baz,
- with_polymorphic=('*', foo.join(baz, foo.c.b=='baz').alias('baz')),
+ with_polymorphic=('*', foo.join(baz, foo.c.b == 'baz').alias('baz')),
inherits=Foo,
- inherit_condition=(foo.c.a==baz.c.a),
+ inherit_condition=(foo.c.a == baz.c.a),
inherit_foreign_keys=[baz.c.a],
polymorphic_identity='baz')
mapper(Bar, bar,
- with_polymorphic=('*', foo.join(bar, foo.c.b=='bar').alias('bar')),
+ with_polymorphic=('*', foo.join(bar, foo.c.b == 'bar').alias('bar')),
inherits=Foo,
- inherit_condition=(foo.c.a==bar.c.a),
+ inherit_condition=(foo.c.a == bar.c.a),
inherit_foreign_keys=[bar.c.a],
polymorphic_identity='bar')
- s = sessionmaker(bind=testing.db)()
+ s = Session()
assert [Baz(), Baz(), Bar(), Bar()] == s.query(Foo).order_by(Foo.b.desc()).all()
assert [Bar(), Bar()] == s.query(Bar).all()
+
+class JoinFromSelectPersistenceTest(fixtures.MappedTest):
+ """test for [ticket:2885]"""
+
+ @classmethod
+ def define_tables(cls, metadata):
+ Table('base', metadata,
+ Column('id', Integer, primary_key=True,
+ test_needs_autoincrement=True),
+ Column('type', String(50))
+ )
+ Table('child', metadata,
+ # 1. name of column must be different, so that we rely on
+ # mapper._table_to_equated to link the two cols
+ Column('child_id', Integer, ForeignKey('base.id'), primary_key=True),
+ Column('name', String(50))
+ )
+
+ @classmethod
+ def setup_classes(cls):
+ class Base(cls.Comparable):
+ pass
+ class Child(Base):
+ pass
+
+ def test_map_to_select(self):
+ Base, Child = self.classes.Base, self.classes.Child
+ base, child = self.tables.base, self.tables.child
+
+ base_select = select([base]).alias()
+ mapper(Base, base_select, polymorphic_on=base_select.c.type,
+ polymorphic_identity='base')
+ mapper(Child, child, inherits=Base,
+ polymorphic_identity='child')
+
+ sess = Session()
+
+ # 2. use an id other than "1" here so can't rely on
+ # the two inserts having the same id
+ c1 = Child(id=12, name='c1')
+ sess.add(c1)
+
+ sess.commit()
+ sess.close()
+
+ c1 = sess.query(Child).one()
+ eq_(c1.name, 'c1')