diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2022-03-30 18:01:58 -0400 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2022-04-04 09:26:43 -0400 |
commit | 3b4d62f4f72e8dfad7f38db192a6a90a8551608c (patch) | |
tree | d0334c4bb52f803bd7dad661f2e6a12e25f5880c /lib/sqlalchemy/sql/base.py | |
parent | 4e603e23755f31278f27a45449120a8dea470a45 (diff) | |
download | sqlalchemy-3b4d62f4f72e8dfad7f38db192a6a90a8551608c.tar.gz |
pep484 - sql.selectable
the pep484 task becomes more intense as there is mounting
pressure to come up with a consistency in how data moves
from end-user to instance variable.
current thinking is coming into:
1. there are _typing._XYZArgument objects that represent "what the
user sent"
2. there's the roles, which represent a kind of "filter" for different
kinds of objects. These are mostly important as the argument
we pass to coerce().
3. there's the thing that coerce() returns, which should be what the
construct uses as its internal representation of the thing.
This is _typing._XYZElement.
but there's some controversy over whether or
not we should pass actual ClauseElements around by their role
or not. I think we shouldn't at the moment, but this makes the
"role-ness" of something a little less portable. Like, we have
to set DMLTableRole for TableClause, Join, and Alias, but then
also we have to repeat those three types in order to set up
_DMLTableElement.
Other change introduced here, there was a deannotate=True
for the left/right of a sql.join(). All tests pass without that.
I'd rather not have that there as if we have a join(A, B) where
A, B are mapped classes, we want them inside of the _annotations.
The rationale seems to be performance, but this performance can
be illustrated to be on the compile side which we hope is cached
in the normal case.
CTEs now accommodate for text selects including recursive.
Get typing to accommodate "util.preloaded" cleanly; add "preloaded"
as a real module. This seemed like we would have needed
pep562 `__getattr__()` but we don't, just set names in
globals() as we import them.
References: #6810
Change-Id: I34d17f617de2fe2c086fc556bd55748dc782faf0
Diffstat (limited to 'lib/sqlalchemy/sql/base.py')
-rw-r--r-- | lib/sqlalchemy/sql/base.py | 23 |
1 files changed, 18 insertions, 5 deletions
diff --git a/lib/sqlalchemy/sql/base.py b/lib/sqlalchemy/sql/base.py index 19e4c13d2..6b25d8fcd 100644 --- a/lib/sqlalchemy/sql/base.py +++ b/lib/sqlalchemy/sql/base.py @@ -63,12 +63,14 @@ if TYPE_CHECKING: from . import elements from . import type_api from ._typing import _ColumnsClauseArgument - from ._typing import _SelectIterable from .elements import BindParameter from .elements import ColumnClause from .elements import ColumnElement from .elements import NamedColumn from .elements import SQLCoreOperations + from .elements import TextClause + from .selectable import _JoinTargetElement + from .selectable import _SelectIterable from .selectable import FromClause from ..engine import Connection from ..engine import Result @@ -167,7 +169,11 @@ class SingletonConstant(Immutable): cls._singleton = obj -def _from_objects(*elements: ColumnElement[Any]) -> Iterator[FromClause]: +def _from_objects( + *elements: Union[ + ColumnElement[Any], FromClause, TextClause, _JoinTargetElement + ] +) -> Iterator[FromClause]: return itertools.chain.from_iterable( [element._from_objects for element in elements] ) @@ -255,6 +261,11 @@ def _expand_cloned(elements): predecessors. """ + # TODO: cython candidate + # and/or change approach: in + # https://gerrit.sqlalchemy.org/c/sqlalchemy/sqlalchemy/+/3712 we propose + # getting rid of _cloned_set. + # turning this into chain.from_iterable adds all kinds of callcount return itertools.chain(*[x._cloned_set for x in elements]) @@ -1559,6 +1570,11 @@ class ColumnCollection(Generic[_COLKEY, _COL]): was moved onto the :class:`_expression.ColumnCollection` itself. """ + # TODO: cython candidate + + # don't dig around if the column is locally present + if column in self._colset: + return column def embedded(expanded_proxy_set, target_set): for t in target_set.difference(expanded_proxy_set): @@ -1568,9 +1584,6 @@ class ColumnCollection(Generic[_COLKEY, _COL]): return False return True - # don't dig around if the column is locally present - if column in self._colset: - return column col, intersect = None, None target_set = column.proxy_set cols = [c for (k, c) in self._collection] |