summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy
diff options
context:
space:
mode:
authorFederico Caselli <cfederico87@gmail.com>2022-12-03 17:39:55 +0100
committerMike Bayer <mike_mp@zzzcomputing.com>2022-12-03 13:04:58 -0500
commitc1b7600d9ec6cb29eb48455726799a6779704240 (patch)
tree263ba448ef4c72c9d7c9d0f30d328525b59bc93a /lib/sqlalchemy
parent96db7cdd53ee9004be66545989b4ac5632bb7ccf (diff)
downloadsqlalchemy-c1b7600d9ec6cb29eb48455726799a6779704240.tar.gz
Order_by and group_by accept labels
Improve typing to accept labels in ordey_by mand group_by. Change-Id: I33e5d6f64633d39a220108d412ef84d6478b25e6
Diffstat (limited to 'lib/sqlalchemy')
-rw-r--r--lib/sqlalchemy/orm/query.py11
-rw-r--r--lib/sqlalchemy/sql/_elements_constructors.py9
-rw-r--r--lib/sqlalchemy/sql/_typing.py2
-rw-r--r--lib/sqlalchemy/sql/elements.py5
-rw-r--r--lib/sqlalchemy/sql/selectable.py11
5 files changed, 26 insertions, 12 deletions
diff --git a/lib/sqlalchemy/orm/query.py b/lib/sqlalchemy/orm/query.py
index 0d8d21df0..d51c8bf9a 100644
--- a/lib/sqlalchemy/orm/query.py
+++ b/lib/sqlalchemy/orm/query.py
@@ -111,6 +111,7 @@ if TYPE_CHECKING:
from ..engine.result import FrozenResult
from ..engine.result import ScalarResult
from ..sql._typing import _ColumnExpressionArgument
+ from ..sql._typing import _ColumnExpressionOrStrLabelArgument
from ..sql._typing import _ColumnsClauseArgument
from ..sql._typing import _DMLColumnArgument
from ..sql._typing import _JoinTargetArgument
@@ -1952,9 +1953,10 @@ class Query(
def order_by(
self: SelfQuery,
__first: Union[
- Literal[None, False, _NoArg.NO_ARG], _ColumnExpressionArgument[Any]
+ Literal[None, False, _NoArg.NO_ARG],
+ _ColumnExpressionOrStrLabelArgument[Any],
] = _NoArg.NO_ARG,
- *clauses: _ColumnExpressionArgument[Any],
+ *clauses: _ColumnExpressionOrStrLabelArgument[Any],
) -> SelfQuery:
"""Apply one or more ORDER BY criteria to the query and return
the newly resulting :class:`_query.Query`.
@@ -2000,9 +2002,10 @@ class Query(
def group_by(
self: SelfQuery,
__first: Union[
- Literal[None, False, _NoArg.NO_ARG], _ColumnExpressionArgument[Any]
+ Literal[None, False, _NoArg.NO_ARG],
+ _ColumnExpressionOrStrLabelArgument[Any],
] = _NoArg.NO_ARG,
- *clauses: _ColumnExpressionArgument[Any],
+ *clauses: _ColumnExpressionOrStrLabelArgument[Any],
) -> SelfQuery:
"""Apply one or more GROUP BY criterion to the query and return
the newly resulting :class:`_query.Query`.
diff --git a/lib/sqlalchemy/sql/_elements_constructors.py b/lib/sqlalchemy/sql/_elements_constructors.py
index 7c5281bee..2e5e399f9 100644
--- a/lib/sqlalchemy/sql/_elements_constructors.py
+++ b/lib/sqlalchemy/sql/_elements_constructors.py
@@ -49,6 +49,7 @@ from ..util.typing import Literal
if typing.TYPE_CHECKING:
from ._typing import _ColumnExpressionArgument
from ._typing import _ColumnExpressionOrLiteralArgument
+ from ._typing import _ColumnExpressionOrStrLabelArgument
from ._typing import _TypeEngineArgument
from .elements import BinaryExpression
from .selectable import FromClause
@@ -226,7 +227,9 @@ def any_(expr: _ColumnExpressionArgument[_T]) -> CollectionAggregate[bool]:
return CollectionAggregate._create_any(expr)
-def asc(column: _ColumnExpressionArgument[_T]) -> UnaryExpression[_T]:
+def asc(
+ column: _ColumnExpressionOrStrLabelArgument[_T],
+) -> UnaryExpression[_T]:
"""Produce an ascending ``ORDER BY`` clause element.
e.g.::
@@ -935,7 +938,9 @@ def column(
return ColumnClause(text, type_, is_literal, _selectable)
-def desc(column: _ColumnExpressionArgument[_T]) -> UnaryExpression[_T]:
+def desc(
+ column: _ColumnExpressionOrStrLabelArgument[_T],
+) -> UnaryExpression[_T]:
"""Produce a descending ``ORDER BY`` clause element.
e.g.::
diff --git a/lib/sqlalchemy/sql/_typing.py b/lib/sqlalchemy/sql/_typing.py
index 8a758e7c7..78e196efc 100644
--- a/lib/sqlalchemy/sql/_typing.py
+++ b/lib/sqlalchemy/sql/_typing.py
@@ -181,6 +181,8 @@ overall which brings in the TextClause object also.
_ColumnExpressionOrLiteralArgument = Union[Any, _ColumnExpressionArgument[_T]]
+_ColumnExpressionOrStrLabelArgument = Union[str, _ColumnExpressionArgument[_T]]
+
_InfoType = Dict[Any, Any]
"""the .info dictionary accepted and used throughout Core /ORM"""
diff --git a/lib/sqlalchemy/sql/elements.py b/lib/sqlalchemy/sql/elements.py
index eff8c9bc1..3896d4cbd 100644
--- a/lib/sqlalchemy/sql/elements.py
+++ b/lib/sqlalchemy/sql/elements.py
@@ -80,6 +80,7 @@ from ..util.typing import Literal
if typing.TYPE_CHECKING:
from ._typing import _ColumnExpressionArgument
+ from ._typing import _ColumnExpressionOrStrLabelArgument
from ._typing import _InfoType
from ._typing import _PropagateAttrsType
from ._typing import _TypeEngineArgument
@@ -3494,7 +3495,7 @@ class UnaryExpression(ColumnElement[_T]):
@classmethod
def _create_desc(
- cls, column: _ColumnExpressionArgument[_T]
+ cls, column: _ColumnExpressionOrStrLabelArgument[_T]
) -> UnaryExpression[_T]:
return UnaryExpression(
coercions.expect(roles.ByOfRole, column),
@@ -3505,7 +3506,7 @@ class UnaryExpression(ColumnElement[_T]):
@classmethod
def _create_asc(
cls,
- column: _ColumnExpressionArgument[_T],
+ column: _ColumnExpressionOrStrLabelArgument[_T],
) -> UnaryExpression[_T]:
return UnaryExpression(
coercions.expect(roles.ByOfRole, column),
diff --git a/lib/sqlalchemy/sql/selectable.py b/lib/sqlalchemy/sql/selectable.py
index 2dcc611fa..fd4157afd 100644
--- a/lib/sqlalchemy/sql/selectable.py
+++ b/lib/sqlalchemy/sql/selectable.py
@@ -106,6 +106,7 @@ _T = TypeVar("_T", bound=Any)
if TYPE_CHECKING:
from ._typing import _ColumnExpressionArgument
+ from ._typing import _ColumnExpressionOrStrLabelArgument
from ._typing import _FromClauseArgument
from ._typing import _JoinTargetArgument
from ._typing import _MAYBE_ENTITY
@@ -4146,9 +4147,10 @@ class GenerativeSelect(SelectBase, Generative):
def order_by(
self: SelfGenerativeSelect,
__first: Union[
- Literal[None, _NoArg.NO_ARG], _ColumnExpressionArgument[Any]
+ Literal[None, _NoArg.NO_ARG],
+ _ColumnExpressionOrStrLabelArgument[Any],
] = _NoArg.NO_ARG,
- *clauses: _ColumnExpressionArgument[Any],
+ *clauses: _ColumnExpressionOrStrLabelArgument[Any],
) -> SelfGenerativeSelect:
r"""Return a new selectable with the given list of ORDER BY
criteria applied.
@@ -4190,9 +4192,10 @@ class GenerativeSelect(SelectBase, Generative):
def group_by(
self: SelfGenerativeSelect,
__first: Union[
- Literal[None, _NoArg.NO_ARG], _ColumnExpressionArgument[Any]
+ Literal[None, _NoArg.NO_ARG],
+ _ColumnExpressionOrStrLabelArgument[Any],
] = _NoArg.NO_ARG,
- *clauses: _ColumnExpressionArgument[Any],
+ *clauses: _ColumnExpressionOrStrLabelArgument[Any],
) -> SelfGenerativeSelect:
r"""Return a new selectable with the given list of GROUP BY
criterion applied.