summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/ext/declarative
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2014-02-08 21:24:13 -0500
committerMike Bayer <mike_mp@zzzcomputing.com>2014-02-08 21:24:13 -0500
commitee88e648f7a56ef76426957a5344639ab9954d9d (patch)
treee64a9406e93ab44b937c04568a752d9083a396d7 /lib/sqlalchemy/ext/declarative
parent5c188f6c1ce85eaace27f052bfd1a14f74f6a659 (diff)
downloadsqlalchemy-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.py28
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)