diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2014-02-08 21:24:13 -0500 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2014-02-08 21:24:13 -0500 |
| commit | ee88e648f7a56ef76426957a5344639ab9954d9d (patch) | |
| tree | e64a9406e93ab44b937c04568a752d9083a396d7 /lib/sqlalchemy/ext/declarative | |
| parent | 5c188f6c1ce85eaace27f052bfd1a14f74f6a659 (diff) | |
| download | sqlalchemy-ee88e648f7a56ef76426957a5344639ab9954d9d.tar.gz | |
- Fixed bug where the :class:`.AutomapBase` class of the
new automap extension would fail if classes
were pre-arranged in single or potentially joined inheritance patterns.
The repaired joined inheritance issue could also potentially apply when
using :class:`.DeferredReflection` as well.
Diffstat (limited to 'lib/sqlalchemy/ext/declarative')
| -rw-r--r-- | lib/sqlalchemy/ext/declarative/base.py | 28 |
1 files changed, 25 insertions, 3 deletions
diff --git a/lib/sqlalchemy/ext/declarative/base.py b/lib/sqlalchemy/ext/declarative/base.py index a764f126b..4fda9c734 100644 --- a/lib/sqlalchemy/ext/declarative/base.py +++ b/lib/sqlalchemy/ext/declarative/base.py @@ -12,6 +12,7 @@ from ...orm.properties import ColumnProperty, CompositeProperty from ...orm.attributes import QueryableAttribute from ...orm.base import _is_mapped_class from ... import util, exc +from ...util import topological from ...sql import expression from ... import event from . import clsregistry @@ -432,9 +433,30 @@ class _DeferredMapperConfig(_MapperConfig): @classmethod - def classes_for_base(cls, base_cls): - return [m for m in cls._configs.values() - if issubclass(m.cls, base_cls)] + def classes_for_base(cls, base_cls, sort=True): + classes_for_base = [m for m in cls._configs.values() + if issubclass(m.cls, base_cls)] + if not sort: + return classes_for_base + + all_m_by_cls = dict( + (m.cls, m) + for m in classes_for_base + ) + + tuples = [] + for m_cls in all_m_by_cls: + tuples.extend( + (all_m_by_cls[base_cls], all_m_by_cls[m_cls]) + for base_cls in m_cls.__bases__ + if base_cls in all_m_by_cls + ) + return list( + topological.sort( + tuples, + classes_for_base + ) + ) def map(self): self._configs.pop(self._cls, None) |
