From eee7a3add99df2865e6d907f29f84f6d4ce22a8b Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Wed, 29 Dec 2021 19:26:08 -0500 Subject: remove 2.0-removed Query elements * :meth:`_orm.Query.join` no longer accepts the "aliased" and "from_joinpoint" arguments * :meth:`_orm.Query.join` no longer accepts chains of multiple join targets in one method call. * ``Query.from_self()`` and ``Query.with_polymorphic()`` are removed. Change-Id: I534d04b53a538a4fc374966eb2bc8eb98a16497d References: #7257 --- lib/sqlalchemy/sql/coercions.py | 19 +++++-------------- lib/sqlalchemy/sql/roles.py | 5 ++++- lib/sqlalchemy/sql/selectable.py | 23 +++++++---------------- 3 files changed, 16 insertions(+), 31 deletions(-) (limited to 'lib/sqlalchemy/sql') diff --git a/lib/sqlalchemy/sql/coercions.py b/lib/sqlalchemy/sql/coercions.py index fa21fbeef..1a0336c67 100644 --- a/lib/sqlalchemy/sql/coercions.py +++ b/lib/sqlalchemy/sql/coercions.py @@ -606,22 +606,15 @@ class InElementImpl(RoleImpl): return element -class OnClauseImpl(_CoerceLiterals, _ColumnCoercions, RoleImpl): +class OnClauseImpl(_ColumnCoercions, RoleImpl): __slots__ = () _coerce_consts = True - def _text_coercion(self, element, argname=None, legacy=False): - if legacy and isinstance(element, str): - util.warn_deprecated_20( - "Using strings to indicate relationship names in " - "Query.join() is deprecated and will be removed in " - "SQLAlchemy 2.0. Please use the class-bound attribute " - "directly." - ) - return element - - return super(OnClauseImpl, self)._text_coercion(element, argname) + def _literal_coercion( + self, element, name=None, type_=None, argname=None, is_crud=False, **kw + ): + self._raise_for_expected(element) def _post_coercion(self, resolved, original_element=None, **kw): # this is a hack right now as we want to use coercion on an @@ -936,8 +929,6 @@ class JoinTargetImpl(RoleImpl): # #6550, unless JoinTargetImpl._skip_clauseelement_for_target_match # were set to False. return original_element - elif legacy and isinstance(resolved, roles.WhereHavingRole): - return resolved elif legacy and resolved._is_select_statement: util.warn_deprecated( "Implicit coercion of SELECT and textual SELECT " diff --git a/lib/sqlalchemy/sql/roles.py b/lib/sqlalchemy/sql/roles.py index 1f6a8ddf2..f076f1092 100644 --- a/lib/sqlalchemy/sql/roles.py +++ b/lib/sqlalchemy/sql/roles.py @@ -120,7 +120,10 @@ class StatementOptionRole(StructuralRole): class OnClauseRole(AllowsLambdaRole, StructuralRole): __slots__ = () - _role_name = "SQL expression for ON clause" + _role_name = ( + "ON clause, typically a SQL expression or " + "ORM relationship attribute" + ) class WhereHavingRole(OnClauseRole): diff --git a/lib/sqlalchemy/sql/selectable.py b/lib/sqlalchemy/sql/selectable.py index 8b35dc6ac..b53235a83 100644 --- a/lib/sqlalchemy/sql/selectable.py +++ b/lib/sqlalchemy/sql/selectable.py @@ -4636,7 +4636,7 @@ class SelectState(util.MemoizedSlots, CompileState): class _SelectFromElements: def _iterate_from_elements(self): # note this does not include elements - # in _setup_joins or _legacy_setup_joins + # in _setup_joins seen = set() for element in self._raw_columns: @@ -4666,7 +4666,6 @@ class _MemoizedSelectEntities( _traverse_internals = [ ("_raw_columns", InternalTraversal.dp_clauseelement_list), ("_setup_joins", InternalTraversal.dp_setup_join_tuple), - ("_legacy_setup_joins", InternalTraversal.dp_setup_join_tuple), ("_with_options", InternalTraversal.dp_executable_options), ] @@ -4680,22 +4679,15 @@ class _MemoizedSelectEntities( @classmethod def _generate_for_statement(cls, select_stmt): - if ( - select_stmt._setup_joins - or select_stmt._legacy_setup_joins - or select_stmt._with_options - ): + if select_stmt._setup_joins or select_stmt._with_options: self = _MemoizedSelectEntities() self._raw_columns = select_stmt._raw_columns self._setup_joins = select_stmt._setup_joins - self._legacy_setup_joins = select_stmt._legacy_setup_joins self._with_options = select_stmt._with_options select_stmt._memoized_select_entities += (self,) select_stmt._raw_columns = ( select_stmt._setup_joins - ) = ( - select_stmt._legacy_setup_joins ) = select_stmt._with_options = () @@ -4730,7 +4722,6 @@ class Select( __visit_name__ = "select" _setup_joins = () - _legacy_setup_joins = () _memoized_select_entities = () _distinct = False @@ -4757,7 +4748,6 @@ class Select( ("_order_by_clauses", InternalTraversal.dp_clauseelement_tuple), ("_group_by_clauses", InternalTraversal.dp_clauseelement_tuple), ("_setup_joins", InternalTraversal.dp_setup_join_tuple), - ("_legacy_setup_joins", InternalTraversal.dp_setup_join_tuple), ("_correlate", InternalTraversal.dp_clauseelement_tuple), ("_correlate_except", InternalTraversal.dp_clauseelement_tuple), ("_limit_clause", InternalTraversal.dp_clauseelement), @@ -4921,7 +4911,7 @@ class Select( @_generative def join( - self: SelfSelect, target, onclause=None, isouter=False, full=False + self: SelfSelect, target, onclause=None, *, isouter=False, full=False ) -> SelfSelect: r"""Create a SQL JOIN against this :class:`_expression.Select` object's criterion @@ -4990,7 +4980,7 @@ class Select( ) return self - def outerjoin_from(self, from_, target, onclause=None, full=False): + def outerjoin_from(self, from_, target, onclause=None, *, full=False): r"""Create a SQL LEFT OUTER JOIN against this :class:`_expression.Select` object's criterion and apply generatively, returning the newly resulting @@ -5009,8 +4999,9 @@ class Select( from_, target, onclause=None, + *, isouter=False, - full=False, + full=False ) -> SelfSelect: r"""Create a SQL JOIN against this :class:`_expression.Select` object's criterion @@ -5071,7 +5062,7 @@ class Select( ) return self - def outerjoin(self, target, onclause=None, full=False): + def outerjoin(self, target, onclause=None, *, full=False): """Create a left outer join. Parameters are the same as that of :meth:`_expression.Select.join`. -- cgit v1.2.1