diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2013-12-03 13:46:41 -0500 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2013-12-03 13:46:41 -0500 |
commit | 36e1aa0afdf7e42f88426da4b2e9ee631d16728c (patch) | |
tree | 233b2308824abd1faab762e5df7fbcd815049cad /test/ext/declarative/test_reflection.py | |
parent | 21feea9c1d278036cc37add813b72d0dbd4b1754 (diff) | |
download | sqlalchemy-36e1aa0afdf7e42f88426da4b2e9ee631d16728c.tar.gz |
- The :class:`.DeferredReflection` class has been enhanced to provide
automatic reflection support for the "secondary" table referred
to by a :func:`.relationship`. "secondary", when specified
either as a string table name, or as a :class:`.Table` object with
only a name and :class:`.MetaData` object will also be included
in the reflection process when :meth:`.DeferredReflection.prepare`
is called. [ticket:2865]
- clsregistry._resolver() now uses a stateful _class_resolver()
class in order to handle the work of mapping strings to
objects. This is to provide for simpler extensibility, namely
a ._resolvers collection of ad-hoc name resolution functions;
the DeferredReflection class adds its own resolver here in order
to handle relationship(secondary) names which generate new
Table objects.
Diffstat (limited to 'test/ext/declarative/test_reflection.py')
-rw-r--r-- | test/ext/declarative/test_reflection.py | 112 |
1 files changed, 83 insertions, 29 deletions
diff --git a/test/ext/declarative/test_reflection.py b/test/ext/declarative/test_reflection.py index 013439f93..26496f1ad 100644 --- a/test/ext/declarative/test_reflection.py +++ b/test/ext/declarative/test_reflection.py @@ -47,9 +47,8 @@ class DeclarativeReflectionTest(DeclarativeReflectionBase): test_needs_fk=True, ) - def test_basic(self): - meta = MetaData(testing.db) + def test_basic(self): class User(Base, fixtures.ComparableEntity): __tablename__ = 'users' @@ -80,8 +79,6 @@ class DeclarativeReflectionTest(DeclarativeReflectionBase): eq_(a1.user, User(name='u1')) def test_rekey(self): - meta = MetaData(testing.db) - class User(Base, fixtures.ComparableEntity): __tablename__ = 'users' @@ -114,8 +111,6 @@ class DeclarativeReflectionTest(DeclarativeReflectionBase): assert_raises(TypeError, User, name='u3') def test_supplied_fk(self): - meta = MetaData(testing.db) - class IMHandle(Base, fixtures.ComparableEntity): __tablename__ = 'imhandles' @@ -151,7 +146,7 @@ class DeclarativeReflectionTest(DeclarativeReflectionBase): class DeferredReflectBase(DeclarativeReflectionBase): def teardown(self): - super(DeferredReflectBase,self).teardown() + super(DeferredReflectBase, self).teardown() from sqlalchemy.ext.declarative.base import _MapperConfig _MapperConfig.configs.clear() @@ -275,7 +270,7 @@ class DeferredReflectionTest(DeferredReflectBase): @decl.declared_attr def __mapper_args__(cls): return { - "order_by":cls.__table__.c.name + "order_by": cls.__table__.c.name } decl.DeferredReflection.prepare(testing.db) @@ -297,6 +292,65 @@ class DeferredReflectionTest(DeferredReflectBase): ] ) +class DeferredSecondaryReflectionTest(DeferredReflectBase): + @classmethod + def define_tables(cls, metadata): + Table('users', metadata, + Column('id', Integer, + primary_key=True, test_needs_autoincrement=True), + Column('name', String(50)), test_needs_fk=True) + + Table('user_items', metadata, + Column('user_id', ForeignKey('users.id'), primary_key=True), + Column('item_id', ForeignKey('items.id'), primary_key=True), + test_needs_fk=True + ) + + Table('items', metadata, + Column('id', Integer, primary_key=True, + test_needs_autoincrement=True), + Column('name', String(50)), + test_needs_fk=True + ) + + def _roundtrip(self): + + User = Base._decl_class_registry['User'] + Item = Base._decl_class_registry['Item'] + + u1 = User(name='u1', items=[Item(name='i1'), Item(name='i2')]) + + sess = Session() + sess.add(u1) + sess.commit() + + eq_(sess.query(User).all(), [User(name='u1', + items=[Item(name='i1'), Item(name='i2')])]) + + def test_string_resolution(self): + class User(decl.DeferredReflection, fixtures.ComparableEntity, Base): + __tablename__ = 'users' + + items = relationship("Item", secondary="user_items") + + class Item(decl.DeferredReflection, fixtures.ComparableEntity, Base): + __tablename__ = 'items' + + decl.DeferredReflection.prepare(testing.db) + self._roundtrip() + + def test_table_resolution(self): + class User(decl.DeferredReflection, fixtures.ComparableEntity, Base): + __tablename__ = 'users' + + items = relationship("Item", secondary=Table("user_items", Base.metadata)) + + class Item(decl.DeferredReflection, fixtures.ComparableEntity, Base): + __tablename__ = 'items' + + decl.DeferredReflection.prepare(testing.db) + self._roundtrip() + class DeferredInhReflectBase(DeferredReflectBase): def _roundtrip(self): Foo = Base._decl_class_registry['Foo'] @@ -338,11 +392,11 @@ class DeferredSingleInhReflectionTest(DeferredInhReflectBase): class Foo(decl.DeferredReflection, fixtures.ComparableEntity, Base): __tablename__ = 'foo' - __mapper_args__ = {"polymorphic_on":"type", - "polymorphic_identity":"foo"} + __mapper_args__ = {"polymorphic_on": "type", + "polymorphic_identity": "foo"} class Bar(Foo): - __mapper_args__ = {"polymorphic_identity":"bar"} + __mapper_args__ = {"polymorphic_identity": "bar"} decl.DeferredReflection.prepare(testing.db) self._roundtrip() @@ -351,11 +405,11 @@ class DeferredSingleInhReflectionTest(DeferredInhReflectBase): class Foo(decl.DeferredReflection, fixtures.ComparableEntity, Base): __tablename__ = 'foo' - __mapper_args__ = {"polymorphic_on":"type", - "polymorphic_identity":"foo"} + __mapper_args__ = {"polymorphic_on": "type", + "polymorphic_identity": "foo"} class Bar(Foo): - __mapper_args__ = {"polymorphic_identity":"bar"} + __mapper_args__ = {"polymorphic_identity": "bar"} bar_data = Column(String(30)) decl.DeferredReflection.prepare(testing.db) @@ -365,12 +419,12 @@ class DeferredSingleInhReflectionTest(DeferredInhReflectBase): class Foo(decl.DeferredReflection, fixtures.ComparableEntity, Base): __tablename__ = 'foo' - __mapper_args__ = {"polymorphic_on":"type", - "polymorphic_identity":"foo"} + __mapper_args__ = {"polymorphic_on": "type", + "polymorphic_identity": "foo"} id = Column(Integer, primary_key=True) class Bar(Foo): - __mapper_args__ = {"polymorphic_identity":"bar"} + __mapper_args__ = {"polymorphic_identity": "bar"} decl.DeferredReflection.prepare(testing.db) self._roundtrip() @@ -395,12 +449,12 @@ class DeferredJoinedInhReflectionTest(DeferredInhReflectBase): class Foo(decl.DeferredReflection, fixtures.ComparableEntity, Base): __tablename__ = 'foo' - __mapper_args__ = {"polymorphic_on":"type", - "polymorphic_identity":"foo"} + __mapper_args__ = {"polymorphic_on": "type", + "polymorphic_identity": "foo"} class Bar(Foo): __tablename__ = 'bar' - __mapper_args__ = {"polymorphic_identity":"bar"} + __mapper_args__ = {"polymorphic_identity": "bar"} decl.DeferredReflection.prepare(testing.db) self._roundtrip() @@ -409,12 +463,12 @@ class DeferredJoinedInhReflectionTest(DeferredInhReflectBase): class Foo(decl.DeferredReflection, fixtures.ComparableEntity, Base): __tablename__ = 'foo' - __mapper_args__ = {"polymorphic_on":"type", - "polymorphic_identity":"foo"} + __mapper_args__ = {"polymorphic_on": "type", + "polymorphic_identity": "foo"} class Bar(Foo): __tablename__ = 'bar' - __mapper_args__ = {"polymorphic_identity":"bar"} + __mapper_args__ = {"polymorphic_identity": "bar"} bar_data = Column(String(30)) decl.DeferredReflection.prepare(testing.db) @@ -424,13 +478,13 @@ class DeferredJoinedInhReflectionTest(DeferredInhReflectBase): class Foo(decl.DeferredReflection, fixtures.ComparableEntity, Base): __tablename__ = 'foo' - __mapper_args__ = {"polymorphic_on":"type", - "polymorphic_identity":"foo"} + __mapper_args__ = {"polymorphic_on": "type", + "polymorphic_identity": "foo"} id = Column(Integer, primary_key=True) class Bar(Foo): __tablename__ = 'bar' - __mapper_args__ = {"polymorphic_identity":"bar"} + __mapper_args__ = {"polymorphic_identity": "bar"} decl.DeferredReflection.prepare(testing.db) self._roundtrip() @@ -439,12 +493,12 @@ class DeferredJoinedInhReflectionTest(DeferredInhReflectBase): class Foo(decl.DeferredReflection, fixtures.ComparableEntity, Base): __tablename__ = 'foo' - __mapper_args__ = {"polymorphic_on":"type", - "polymorphic_identity":"foo"} + __mapper_args__ = {"polymorphic_on": "type", + "polymorphic_identity": "foo"} class Bar(Foo): __tablename__ = 'bar' - __mapper_args__ = {"polymorphic_identity":"bar"} + __mapper_args__ = {"polymorphic_identity": "bar"} id = Column(Integer, ForeignKey('foo.id'), primary_key=True) decl.DeferredReflection.prepare(testing.db) |