diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2022-04-04 10:13:23 -0400 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2022-04-07 10:47:53 -0400 |
| commit | 2acc9ec1281b2818bd44804f040d94ec46215688 (patch) | |
| tree | 40e77ef66a8682b4a1d885575412a78152806397 /lib/sqlalchemy/orm/query.py | |
| parent | 3b4d62f4f72e8dfad7f38db192a6a90a8551608c (diff) | |
| download | sqlalchemy-2acc9ec1281b2818bd44804f040d94ec46215688.tar.gz | |
cx_Oracle modernize
Full "RETURNING" support is implemented for the cx_Oracle dialect, meaning
multiple RETURNING rows are now recived for DML statements that produce
more than one row for RETURNING.
cx_Oracle 7 is now the minimum version for cx_Oracle.
Getting Oracle to do multirow returning took about 5 minutes. however,
getting Oracle's RETURNING system to integrate with ORM-enabled
insert, update, delete, is a big deal because that architecture wasn't
really working very robustly, including some recent changes in 1.4
for FromStatement were done in a hurry, so this patch also cleans up
the FromStatement situation and begins to establish it more concretely
as the base for all ReturnsRows / TextClause ORM scenarios.
Fixes: #6245
Change-Id: I2b4e6007affa51ce311d2d5baa3917f356ab961f
Diffstat (limited to 'lib/sqlalchemy/orm/query.py')
| -rw-r--r-- | lib/sqlalchemy/orm/query.py | 92 |
1 files changed, 1 insertions, 91 deletions
diff --git a/lib/sqlalchemy/orm/query.py b/lib/sqlalchemy/orm/query.py index b9ced44d5..a754bd4f2 100644 --- a/lib/sqlalchemy/orm/query.py +++ b/lib/sqlalchemy/orm/query.py @@ -21,7 +21,6 @@ database to return iterable result sets. from __future__ import annotations import collections.abc as collections_abc -import itertools import operator from typing import Any from typing import Generic @@ -40,9 +39,9 @@ from .base import _assertions from .context import _column_descriptions from .context import _determine_last_joined_entity from .context import _legacy_filter_by_entity_zero +from .context import FromStatement from .context import LABEL_STYLE_LEGACY_ORM from .context import ORMCompileState -from .context import ORMFromStatementCompileState from .context import QueryContext from .interfaces import ORMColumnDescription from .interfaces import ORMColumnsClauseRole @@ -71,14 +70,10 @@ from ..sql.expression import Exists from ..sql.selectable import _MemoizedSelectEntities from ..sql.selectable import _SelectFromElements from ..sql.selectable import ForUpdateArg -from ..sql.selectable import GroupedElement from ..sql.selectable import HasHints from ..sql.selectable import HasPrefixes from ..sql.selectable import HasSuffixes from ..sql.selectable import LABEL_STYLE_TABLENAME_PLUS_COL -from ..sql.selectable import SelectBase -from ..sql.selectable import SelectStatementGrouping -from ..sql.visitors import InternalTraversal if TYPE_CHECKING: from ..sql.selectable import _SetupJoinsElement @@ -2765,91 +2760,6 @@ class Query( return context -class FromStatement(GroupedElement, SelectBase, Executable): - """Core construct that represents a load of ORM objects from a finished - select or text construct. - - """ - - __visit_name__ = "orm_from_statement" - - _compile_options = ORMFromStatementCompileState.default_compile_options - - _compile_state_factory = ORMFromStatementCompileState.create_for_statement - - _for_update_arg = None - - _traverse_internals = [ - ("_raw_columns", InternalTraversal.dp_clauseelement_list), - ("element", InternalTraversal.dp_clauseelement), - ] + Executable._executable_traverse_internals - - _cache_key_traversal = _traverse_internals + [ - ("_compile_options", InternalTraversal.dp_has_cache_key) - ] - - def __init__(self, entities, element): - self._raw_columns = [ - coercions.expect( - roles.ColumnsClauseRole, - ent, - apply_propagate_attrs=self, - post_inspect=True, - ) - for ent in util.to_list(entities) - ] - self.element = element - - def get_label_style(self): - return self._label_style - - def set_label_style(self, label_style): - return SelectStatementGrouping( - self.element.set_label_style(label_style) - ) - - @property - def _label_style(self): - return self.element._label_style - - def _compiler_dispatch(self, compiler, **kw): - - """provide a fixed _compiler_dispatch method. - - This is roughly similar to using the sqlalchemy.ext.compiler - ``@compiles`` extension. - - """ - - compile_state = self._compile_state_factory(self, compiler, **kw) - - toplevel = not compiler.stack - - if toplevel: - compiler.compile_state = compile_state - - return compiler.process(compile_state.statement, **kw) - - def _ensure_disambiguated_names(self): - return self - - def get_children(self, **kw): - for elem in itertools.chain.from_iterable( - element._from_objects for element in self._raw_columns - ): - yield elem - for elem in super(FromStatement, self).get_children(**kw): - yield elem - - @property - def _returning(self): - return self.element._returning if self.element.is_dml else None - - @property - def _inline(self): - return self.element._inline if self.element.is_dml else None - - class AliasOption(interfaces.LoaderOption): inherit_cache = False |
