summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/orm/query.py
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2022-04-04 10:13:23 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2022-04-07 10:47:53 -0400
commit2acc9ec1281b2818bd44804f040d94ec46215688 (patch)
tree40e77ef66a8682b4a1d885575412a78152806397 /lib/sqlalchemy/orm/query.py
parent3b4d62f4f72e8dfad7f38db192a6a90a8551608c (diff)
downloadsqlalchemy-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.py92
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