diff options
| author | mike bayer <mike_mp@zzzcomputing.com> | 2021-04-17 17:25:00 +0000 |
|---|---|---|
| committer | Gerrit Code Review <gerrit@ci3.zzzcomputing.com> | 2021-04-17 17:25:00 +0000 |
| commit | 4d85ec13725556f8f18a348c1657649faa9ce32a (patch) | |
| tree | 731b2f7be12939a246a78afab9dc73b87326c13e /lib | |
| parent | e2091644678f0d5887d200c32aceca52299a6ca4 (diff) | |
| parent | 9f758d7fe328107cd3d047b8c999dce228a570d1 (diff) | |
| download | sqlalchemy-4d85ec13725556f8f18a348c1657649faa9ce32a.tar.gz | |
Merge "Don't stringify unnamed column elements when proxying"
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/sqlalchemy/dialects/oracle/base.py | 4 | ||||
| -rw-r--r-- | lib/sqlalchemy/dialects/oracle/cx_oracle.py | 2 | ||||
| -rw-r--r-- | lib/sqlalchemy/sql/compiler.py | 2 | ||||
| -rw-r--r-- | lib/sqlalchemy/sql/elements.py | 64 | ||||
| -rw-r--r-- | lib/sqlalchemy/sql/selectable.py | 14 |
5 files changed, 54 insertions, 32 deletions
diff --git a/lib/sqlalchemy/dialects/oracle/base.py b/lib/sqlalchemy/dialects/oracle/base.py index 29f0065cf..9571eb46f 100644 --- a/lib/sqlalchemy/dialects/oracle/base.py +++ b/lib/sqlalchemy/dialects/oracle/base.py @@ -1059,8 +1059,8 @@ class OracleCompiler(compiler.SQLCompiler): columns.append(self.process(col_expr, within_columns_clause=False)) self._add_to_result_map( - getattr(col_expr, "name", col_expr.anon_label), - getattr(col_expr, "name", col_expr.anon_label), + getattr(col_expr, "name", col_expr._anon_name_label), + getattr(col_expr, "name", col_expr._anon_name_label), ( column, getattr(column, "name", None), diff --git a/lib/sqlalchemy/dialects/oracle/cx_oracle.py b/lib/sqlalchemy/dialects/oracle/cx_oracle.py index 87c817066..f007c2b32 100644 --- a/lib/sqlalchemy/dialects/oracle/cx_oracle.py +++ b/lib/sqlalchemy/dialects/oracle/cx_oracle.py @@ -769,7 +769,7 @@ class OracleExecutionContext_cx_oracle(OracleExecutionContext): fetch_strategy = _cursor.FullyBufferedCursorFetchStrategy( self.cursor, [ - (getattr(col, "name", col.anon_label), None) + (getattr(col, "name", col._anon_name_label), None) for col in self.compiled.returning ], initial_buffer=[tuple(returning_params)], diff --git a/lib/sqlalchemy/sql/compiler.py b/lib/sqlalchemy/sql/compiler.py index 8a4fa1f2f..84df0837c 100644 --- a/lib/sqlalchemy/sql/compiler.py +++ b/lib/sqlalchemy/sql/compiler.py @@ -2876,7 +2876,7 @@ class SQLCompiler(Compiled): ): result_expr = _CompileLabel( col_expr, - column.anon_label + column._anon_name_label if not column_is_repeated else column._dedupe_label_anon_label, ) diff --git a/lib/sqlalchemy/sql/elements.py b/lib/sqlalchemy/sql/elements.py index 699a874fb..696f3b249 100644 --- a/lib/sqlalchemy/sql/elements.py +++ b/lib/sqlalchemy/sql/elements.py @@ -903,23 +903,20 @@ class ColumnElement( elif self.key: return self.key else: - try: - return str(self) - except exc.UnsupportedCompilationError: - return self.anon_label + return getattr(self, "name", "_no_label") def _make_proxy( - self, selectable, name=None, name_is_truncatable=False, **kw + self, selectable, name=None, key=None, name_is_truncatable=False, **kw ): """Create a new :class:`_expression.ColumnElement` representing this - :class:`_expression.ColumnElement` - as it appears in the select list of a - descending selectable. + :class:`_expression.ColumnElement` as it appears in the select list of + a descending selectable. """ if name is None: - name = self.anon_label - key = self._proxy_key + name = self._anon_name_label + if key is None: + key = self._proxy_key else: key = name @@ -980,7 +977,7 @@ class ColumnElement( return _anonymous_label.safe_construct(hash(self), seed or "anon") @util.memoized_property - def anon_label(self): + def _anon_name_label(self): """Provides a constant 'anonymous label' for this ColumnElement. This is a label() expression which will be named at compile time. @@ -992,12 +989,16 @@ class ColumnElement( for expressions that are known to be 'unnamed' like binary expressions and function calls. + .. versionchanged:: 1.4.9 - this attribute was not intended to be + public and is renamed to _anon_name_label. anon_name exists + for backwards compat + """ name = getattr(self, "name", None) return self._anon_label(name) @util.memoized_property - def anon_key_label(self): + def _anon_key_label(self): """Provides a constant 'anonymous key label' for this ColumnElement. Compare to ``anon_label``, except that the "key" of the column, @@ -1006,9 +1007,30 @@ class ColumnElement( This is used when a deduplicating key is placed into the columns collection of a selectable. + .. versionchanged:: 1.4.9 - this attribute was not intended to be + public and is renamed to _anon_key_label. anon_key_label exists + for backwards compat + """ - name = getattr(self, "key", None) or getattr(self, "name", None) - return self._anon_label(name) + return self._anon_label(self._proxy_key) + + @property + @util.deprecated( + "1.4", + "The :attr:`_expression.ColumnElement.anon_label` attribute is now " + "private, and the public accessor is deprecated.", + ) + def anon_label(self): + return self._anon_name_label + + @property + @util.deprecated( + "1.4", + "The :attr:`_expression.ColumnElement.anon_key_label` attribute is " + "now private, and the public accessor is deprecated.", + ) + def anon_key_label(self): + return self._anon_key_label @util.memoized_property def _dedupe_anon_label(self): @@ -1056,14 +1078,14 @@ class WrapsColumnExpression(object): return None @property - def anon_label(self): + def _anon_name_label(self): wce = self.wrapped_column_expression if hasattr(wce, "name"): return wce.name - elif hasattr(wce, "anon_label"): - return wce.anon_label + elif hasattr(wce, "_anon_name_label"): + return wce._anon_name_label else: - return super(WrapsColumnExpression, self).anon_label + return super(WrapsColumnExpression, self)._anon_name_label class BindParameter(roles.InElementRole, ColumnElement): @@ -3788,7 +3810,7 @@ class Grouping(GroupedElement, ColumnElement): @property def _label(self): - return getattr(self.element, "_label", None) or self.anon_label + return getattr(self.element, "_label", None) or self._anon_name_label @property def _proxies(self): @@ -4962,8 +4984,8 @@ class AnnotatedColumnElement(Annotated): return self._Annotated__element.info @util.memoized_property - def anon_label(self): - return self._Annotated__element.anon_label + def _anon_name_label(self): + return self._Annotated__element._anon_name_label class _truncated_label(quoted_name): diff --git a/lib/sqlalchemy/sql/selectable.py b/lib/sqlalchemy/sql/selectable.py index 3a90f77fb..adfee1737 100644 --- a/lib/sqlalchemy/sql/selectable.py +++ b/lib/sqlalchemy/sql/selectable.py @@ -4138,7 +4138,7 @@ class SelectState(util.MemoizedSlots, CompileState): if name in names: if not pa: pa.append(prefix_anon_map()) - name = c.anon_key_label % pa[0] + name = c._anon_key_label % pa[0] else: names.add(name) @@ -5683,13 +5683,13 @@ class Select( return (None, c, False) elif use_tablename_labels: if c._label is None: - repeated = c.anon_label in names - names[c.anon_label] = c + repeated = c._anon_name_label in names + names[c._anon_name_label] = c return (None, c, repeated) elif getattr(c, "name", None) is None: # this is a scalar_select(). need to improve this case - repeated = c.anon_label in names - names[c.anon_label] = c + repeated = c._anon_name_label in names + names[c._anon_name_label] = c return (None, c, repeated) if use_tablename_labels: @@ -5711,7 +5711,7 @@ class Select( if use_tablename_labels: name = c._label_anon_label else: - name = c.anon_label + name = c._anon_name_label if anon_for_dupe_key and name in names: # here, c._label_anon_label is definitely unique to @@ -5775,7 +5775,7 @@ class Select( if key is not None and key in keys_seen: if pa is None: pa = prefix_anon_map() - key = c.anon_key_label % pa + key = c._anon_key_label % pa keys_seen.add(key) else: key = c._proxy_key |
