diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2014-09-07 00:01:34 -0400 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2014-09-07 00:01:34 -0400 |
commit | 7950270cf2b12807acd7c330b11dae36e50c3a28 (patch) | |
tree | f1ec50aa6fc604d7a2dadf1b41aff73952a05dcc /lib/sqlalchemy/sql/elements.py | |
parent | e80c7cc5c103788a4c7e1c479af2c37cd9c958b3 (diff) | |
download | sqlalchemy-7950270cf2b12807acd7c330b11dae36e50c3a28.tar.gz |
- enhance ClauseAdapter / ColumnAdapter to have new behaviors with labels.
The "anonymize label" logic is now generalized to ClauseAdapter, and takes
place when the anonymize_labels flag is sent, taking effect for all
.columns lookups as well as within traverse() calls against the label
directly.
- traverse() will also memoize what it gets in columns, so that
calling upon traverse() / .columns against the same Label will
produce the same anonymized label. This is so that AliasedClass
produces the same anonymized label when it is accessed per-column
(e.g. SomeAlias.some_column) as well as when it is applied to a Query,
and within column loader strategies (e.g. query(SomeAlias)); the
former uses traverse() while the latter uses .columns
- AliasedClass now calls onto ColumnAdapter
- Query also makes sure to use that same ColumnAdapter from the AliasedClass
in all cases
- update the logic from 0.9 in #1068 to make use of the same
_label_resolve_dict we use for #2992, simplifying how that works
and adding support for new scenarios that were pretty broken
(see #3148, #3188)
Diffstat (limited to 'lib/sqlalchemy/sql/elements.py')
-rw-r--r-- | lib/sqlalchemy/sql/elements.py | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/lib/sqlalchemy/sql/elements.py b/lib/sqlalchemy/sql/elements.py index c8504f21f..ece6bce9e 100644 --- a/lib/sqlalchemy/sql/elements.py +++ b/lib/sqlalchemy/sql/elements.py @@ -688,6 +688,10 @@ class ColumnElement(operators.ColumnOperators, ClauseElement): """ + _allow_label_resolve = True + """A flag that can be flipped to prevent a column from being resolvable + by string label name.""" + _alt_names = () def self_group(self, against=None): @@ -704,8 +708,6 @@ class ColumnElement(operators.ColumnOperators, ClauseElement): else: return super(ColumnElement, self)._negate() - _allow_label_resolve = True - @util.memoized_property def type(self): return type_api.NULLTYPE @@ -1248,6 +1250,8 @@ class TextClause(Executable, ClauseElement): # interpreted in a column expression situation key = _label = _resolve_label = None + _allow_label_resolve = False + def __init__( self, text, @@ -2943,8 +2947,14 @@ class Label(ColumnElement): def get_children(self, **kwargs): return self.element, - def _copy_internals(self, clone=_clone, **kw): + def _copy_internals(self, clone=_clone, anonymize_labels=False, **kw): self.element = clone(self.element, **kw) + if anonymize_labels: + self.name = _anonymous_label( + '%%(%d %s)s' % ( + id(self), getattr(self.element, 'name', 'anon')) + ) + self.key = self._label = self._key_label = self.name @property def _from_objects(self): |