添加注册登录功能
This commit is contained in:
@@ -80,6 +80,7 @@ from ..util.typing import Literal
|
||||
from ..util.typing import ParamSpec
|
||||
from ..util.typing import Self
|
||||
|
||||
|
||||
if typing.TYPE_CHECKING:
|
||||
from ._typing import _ByArgument
|
||||
from ._typing import _ColumnExpressionArgument
|
||||
@@ -88,6 +89,7 @@ if typing.TYPE_CHECKING:
|
||||
from ._typing import _InfoType
|
||||
from ._typing import _PropagateAttrsType
|
||||
from ._typing import _TypeEngineArgument
|
||||
from .base import _EntityNamespace
|
||||
from .base import ColumnSet
|
||||
from .cache_key import _CacheKeyTraversalType
|
||||
from .cache_key import CacheKey
|
||||
@@ -117,6 +119,7 @@ if typing.TYPE_CHECKING:
|
||||
from ..engine.interfaces import SchemaTranslateMapType
|
||||
from ..engine.result import Result
|
||||
|
||||
|
||||
_NUMERIC = Union[float, Decimal]
|
||||
_NUMBER = Union[float, int, Decimal]
|
||||
|
||||
@@ -298,8 +301,7 @@ class CompilerElement(Visitable):
|
||||
if bind:
|
||||
dialect = bind.dialect
|
||||
elif self.stringify_dialect == "default":
|
||||
default = util.preloaded.engine_default
|
||||
dialect = default.StrCompileDialect()
|
||||
dialect = self._default_dialect()
|
||||
else:
|
||||
url = util.preloaded.engine_url
|
||||
dialect = url.URL.create(
|
||||
@@ -308,6 +310,10 @@ class CompilerElement(Visitable):
|
||||
|
||||
return self._compiler(dialect, **kw)
|
||||
|
||||
def _default_dialect(self):
|
||||
default = util.preloaded.engine_default
|
||||
return default.StrCompileDialect()
|
||||
|
||||
def _compiler(self, dialect: Dialect, **kw: Any) -> Compiled:
|
||||
"""Return a compiler appropriate for this ClauseElement, given a
|
||||
Dialect."""
|
||||
@@ -404,6 +410,10 @@ class ClauseElement(
|
||||
self._propagate_attrs = util.immutabledict(values)
|
||||
return self
|
||||
|
||||
def _default_compiler(self) -> SQLCompiler:
|
||||
dialect = self._default_dialect()
|
||||
return dialect.statement_compiler(dialect, self) # type: ignore
|
||||
|
||||
def _clone(self, **kw: Any) -> Self:
|
||||
"""Create a shallow copy of this ClauseElement.
|
||||
|
||||
@@ -452,7 +462,7 @@ class ClauseElement(
|
||||
return self
|
||||
|
||||
@property
|
||||
def _constructor(self):
|
||||
def _constructor(self): # type: ignore[override]
|
||||
"""return the 'constructor' for this ClauseElement.
|
||||
|
||||
This is for the purposes for creating a new object of
|
||||
@@ -491,8 +501,8 @@ class ClauseElement(
|
||||
self = self._is_clone_of
|
||||
return self
|
||||
|
||||
@property
|
||||
def entity_namespace(self):
|
||||
@util.ro_non_memoized_property
|
||||
def entity_namespace(self) -> _EntityNamespace:
|
||||
raise AttributeError(
|
||||
"This SQL expression has no entity namespace "
|
||||
"with which to filter from."
|
||||
@@ -685,6 +695,7 @@ class ClauseElement(
|
||||
else:
|
||||
elem_cache_key = None
|
||||
|
||||
extracted_params: Optional[Sequence[BindParameter[Any]]]
|
||||
if elem_cache_key is not None:
|
||||
if TYPE_CHECKING:
|
||||
assert compiled_cache is not None
|
||||
@@ -741,6 +752,8 @@ class ClauseElement(
|
||||
return self._negate()
|
||||
|
||||
def _negate(self) -> ClauseElement:
|
||||
# TODO: this code is uncovered and in all likelihood is not included
|
||||
# in any codepath. So this should raise NotImplementedError in 2.1
|
||||
grouped = self.self_group(against=operators.inv)
|
||||
assert isinstance(grouped, ColumnElement)
|
||||
return UnaryExpression(grouped, operator=operators.inv)
|
||||
@@ -1432,6 +1445,10 @@ class ColumnElement(
|
||||
|
||||
_alt_names: Sequence[str] = ()
|
||||
|
||||
if TYPE_CHECKING:
|
||||
|
||||
def _ungroup(self) -> ColumnElement[_T]: ...
|
||||
|
||||
@overload
|
||||
def self_group(self, against: None = None) -> ColumnElement[_T]: ...
|
||||
|
||||
@@ -1466,7 +1483,8 @@ class ColumnElement(
|
||||
grouped = self.self_group(against=operators.inv)
|
||||
assert isinstance(grouped, ColumnElement)
|
||||
return UnaryExpression(
|
||||
grouped, operator=operators.inv, wraps_column_expression=True
|
||||
grouped,
|
||||
operator=operators.inv,
|
||||
)
|
||||
|
||||
type: TypeEngine[_T]
|
||||
@@ -2117,8 +2135,8 @@ class BindParameter(roles.InElementRole, KeyedColumnElement[_T]):
|
||||
else:
|
||||
return self
|
||||
|
||||
def _with_binary_element_type(self, type_):
|
||||
c = ClauseElement._clone(self)
|
||||
def _with_binary_element_type(self, type_: TypeEngine[Any]) -> Self:
|
||||
c: Self = ClauseElement._clone(self)
|
||||
c.type = type_
|
||||
return c
|
||||
|
||||
@@ -2208,8 +2226,9 @@ class TypeClause(DQLDMLClauseElement):
|
||||
_traverse_internals: _TraverseInternalsType = [
|
||||
("type", InternalTraversal.dp_type)
|
||||
]
|
||||
type: TypeEngine[Any]
|
||||
|
||||
def __init__(self, type_):
|
||||
def __init__(self, type_: TypeEngine[Any]):
|
||||
self.type = type_
|
||||
|
||||
|
||||
@@ -2287,7 +2306,7 @@ class TextClause(
|
||||
_allow_label_resolve = False
|
||||
|
||||
@property
|
||||
def _is_star(self):
|
||||
def _is_star(self): # type: ignore[override]
|
||||
return self.text == "*"
|
||||
|
||||
def __init__(self, text: str):
|
||||
@@ -2977,14 +2996,16 @@ class ExpressionClauseList(OperatorExpression[_T]):
|
||||
self.clauses = clauses
|
||||
self.operator = operator
|
||||
self.type = type_
|
||||
for c in clauses:
|
||||
if c._propagate_attrs:
|
||||
self._propagate_attrs = c._propagate_attrs
|
||||
break
|
||||
return self
|
||||
|
||||
def _negate(self) -> Any:
|
||||
grouped = self.self_group(against=operators.inv)
|
||||
assert isinstance(grouped, ColumnElement)
|
||||
return UnaryExpression(
|
||||
grouped, operator=operators.inv, wraps_column_expression=True
|
||||
)
|
||||
return UnaryExpression(grouped, operator=operators.inv)
|
||||
|
||||
|
||||
class BooleanClauseList(ExpressionClauseList[bool]):
|
||||
@@ -3602,15 +3623,18 @@ class UnaryExpression(ColumnElement[_T]):
|
||||
("modifier", InternalTraversal.dp_operator),
|
||||
]
|
||||
|
||||
element: ClauseElement
|
||||
element: ColumnElement[Any]
|
||||
operator: Optional[OperatorType]
|
||||
modifier: Optional[OperatorType]
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
element: ColumnElement[Any],
|
||||
*,
|
||||
operator: Optional[OperatorType] = None,
|
||||
modifier: Optional[OperatorType] = None,
|
||||
type_: Optional[_TypeEngineArgument[_T]] = None,
|
||||
wraps_column_expression: bool = False,
|
||||
wraps_column_expression: bool = False, # legacy, not used as of 2.0.42
|
||||
):
|
||||
self.operator = operator
|
||||
self.modifier = modifier
|
||||
@@ -3623,7 +3647,12 @@ class UnaryExpression(ColumnElement[_T]):
|
||||
# know how to get the overloads to express that correctly
|
||||
self.type = type_api.to_instance(type_) # type: ignore
|
||||
|
||||
self.wraps_column_expression = wraps_column_expression
|
||||
def _wraps_unnamed_column(self):
|
||||
ungrouped = self.element._ungroup()
|
||||
return (
|
||||
not isinstance(ungrouped, NamedColumn)
|
||||
or ungrouped._non_anon_label is None
|
||||
)
|
||||
|
||||
@classmethod
|
||||
def _create_nulls_first(
|
||||
@@ -3633,7 +3662,6 @@ class UnaryExpression(ColumnElement[_T]):
|
||||
return UnaryExpression(
|
||||
coercions.expect(roles.ByOfRole, column),
|
||||
modifier=operators.nulls_first_op,
|
||||
wraps_column_expression=False,
|
||||
)
|
||||
|
||||
@classmethod
|
||||
@@ -3644,7 +3672,6 @@ class UnaryExpression(ColumnElement[_T]):
|
||||
return UnaryExpression(
|
||||
coercions.expect(roles.ByOfRole, column),
|
||||
modifier=operators.nulls_last_op,
|
||||
wraps_column_expression=False,
|
||||
)
|
||||
|
||||
@classmethod
|
||||
@@ -3654,7 +3681,6 @@ class UnaryExpression(ColumnElement[_T]):
|
||||
return UnaryExpression(
|
||||
coercions.expect(roles.ByOfRole, column),
|
||||
modifier=operators.desc_op,
|
||||
wraps_column_expression=False,
|
||||
)
|
||||
|
||||
@classmethod
|
||||
@@ -3665,7 +3691,6 @@ class UnaryExpression(ColumnElement[_T]):
|
||||
return UnaryExpression(
|
||||
coercions.expect(roles.ByOfRole, column),
|
||||
modifier=operators.asc_op,
|
||||
wraps_column_expression=False,
|
||||
)
|
||||
|
||||
@classmethod
|
||||
@@ -3680,7 +3705,6 @@ class UnaryExpression(ColumnElement[_T]):
|
||||
col_expr,
|
||||
operator=operators.distinct_op,
|
||||
type_=col_expr.type,
|
||||
wraps_column_expression=False,
|
||||
)
|
||||
|
||||
@classmethod
|
||||
@@ -3695,7 +3719,6 @@ class UnaryExpression(ColumnElement[_T]):
|
||||
col_expr,
|
||||
operator=operators.bitwise_not_op,
|
||||
type_=col_expr.type,
|
||||
wraps_column_expression=False,
|
||||
)
|
||||
|
||||
@property
|
||||
@@ -3709,16 +3732,15 @@ class UnaryExpression(ColumnElement[_T]):
|
||||
def _from_objects(self) -> List[FromClause]:
|
||||
return self.element._from_objects
|
||||
|
||||
def _negate(self):
|
||||
def _negate(self) -> ColumnElement[Any]:
|
||||
if self.type._type_affinity is type_api.BOOLEANTYPE._type_affinity:
|
||||
return UnaryExpression(
|
||||
self.self_group(against=operators.inv),
|
||||
operator=operators.inv,
|
||||
type_=type_api.BOOLEANTYPE,
|
||||
wraps_column_expression=self.wraps_column_expression,
|
||||
)
|
||||
else:
|
||||
return ClauseElement._negate(self)
|
||||
return ColumnElement._negate(self)
|
||||
|
||||
def self_group(
|
||||
self, against: Optional[OperatorType] = None
|
||||
@@ -3755,7 +3777,6 @@ class CollectionAggregate(UnaryExpression[_T]):
|
||||
col_expr,
|
||||
operator=operators.any_op,
|
||||
type_=type_api.BOOLEANTYPE,
|
||||
wraps_column_expression=False,
|
||||
)
|
||||
|
||||
@classmethod
|
||||
@@ -3771,13 +3792,14 @@ class CollectionAggregate(UnaryExpression[_T]):
|
||||
col_expr,
|
||||
operator=operators.all_op,
|
||||
type_=type_api.BOOLEANTYPE,
|
||||
wraps_column_expression=False,
|
||||
)
|
||||
|
||||
# operate and reverse_operate are hardwired to
|
||||
# dispatch onto the type comparator directly, so that we can
|
||||
# ensure "reversed" behavior.
|
||||
def operate(self, op, *other, **kwargs):
|
||||
def operate(
|
||||
self, op: OperatorType, *other: Any, **kwargs: Any
|
||||
) -> ColumnElement[_T]:
|
||||
if not operators.is_comparison(op):
|
||||
raise exc.ArgumentError(
|
||||
"Only comparison operators may be used with ANY/ALL"
|
||||
@@ -3785,7 +3807,9 @@ class CollectionAggregate(UnaryExpression[_T]):
|
||||
kwargs["reverse"] = True
|
||||
return self.comparator.operate(operators.mirror(op), *other, **kwargs)
|
||||
|
||||
def reverse_operate(self, op, other, **kwargs):
|
||||
def reverse_operate(
|
||||
self, op: OperatorType, other: Any, **kwargs: Any
|
||||
) -> ColumnElement[_T]:
|
||||
# comparison operators should never call reverse_operate
|
||||
assert not operators.is_comparison(op)
|
||||
raise exc.ArgumentError(
|
||||
@@ -3802,7 +3826,6 @@ class AsBoolean(WrapsColumnExpression[bool], UnaryExpression[bool]):
|
||||
self.operator = operator
|
||||
self.negate = negate
|
||||
self.modifier = None
|
||||
self.wraps_column_expression = True
|
||||
self._is_implicitly_boolean = element._is_implicitly_boolean
|
||||
|
||||
@property
|
||||
@@ -3868,10 +3891,9 @@ class BinaryExpression(OperatorExpression[_T]):
|
||||
|
||||
"""
|
||||
|
||||
modifiers: Optional[Mapping[str, Any]]
|
||||
|
||||
left: ColumnElement[Any]
|
||||
right: ColumnElement[Any]
|
||||
modifiers: Mapping[str, Any]
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
@@ -4026,13 +4048,11 @@ class GroupedElement(DQLDMLClauseElement):
|
||||
|
||||
__visit_name__ = "grouping"
|
||||
|
||||
element: ClauseElement
|
||||
|
||||
def self_group(self, against: Optional[OperatorType] = None) -> Self:
|
||||
return self
|
||||
|
||||
def _ungroup(self):
|
||||
return self.element._ungroup()
|
||||
def _ungroup(self) -> ClauseElement:
|
||||
raise NotImplementedError()
|
||||
|
||||
|
||||
class Grouping(GroupedElement, ColumnElement[_T]):
|
||||
@@ -4061,6 +4081,10 @@ class Grouping(GroupedElement, ColumnElement[_T]):
|
||||
def _with_binary_element_type(self, type_):
|
||||
return self.__class__(self.element._with_binary_element_type(type_))
|
||||
|
||||
def _ungroup(self) -> ColumnElement[_T]:
|
||||
assert isinstance(self.element, ColumnElement)
|
||||
return self.element._ungroup()
|
||||
|
||||
@util.memoized_property
|
||||
def _is_implicitly_boolean(self):
|
||||
return self.element._is_implicitly_boolean
|
||||
@@ -4179,6 +4203,7 @@ class Over(ColumnElement[_T]):
|
||||
("partition_by", InternalTraversal.dp_clauseelement),
|
||||
("range_", InternalTraversal.dp_plain_obj),
|
||||
("rows", InternalTraversal.dp_plain_obj),
|
||||
("groups", InternalTraversal.dp_plain_obj),
|
||||
]
|
||||
|
||||
order_by: Optional[ClauseList] = None
|
||||
@@ -4190,6 +4215,7 @@ class Over(ColumnElement[_T]):
|
||||
|
||||
range_: Optional[typing_Tuple[_IntOrRange, _IntOrRange]]
|
||||
rows: Optional[typing_Tuple[_IntOrRange, _IntOrRange]]
|
||||
groups: Optional[typing_Tuple[_IntOrRange, _IntOrRange]]
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
@@ -4198,6 +4224,7 @@ class Over(ColumnElement[_T]):
|
||||
order_by: Optional[_ByArgument] = None,
|
||||
range_: Optional[typing_Tuple[Optional[int], Optional[int]]] = None,
|
||||
rows: Optional[typing_Tuple[Optional[int], Optional[int]]] = None,
|
||||
groups: Optional[typing_Tuple[Optional[int], Optional[int]]] = None,
|
||||
):
|
||||
self.element = element
|
||||
if order_by is not None:
|
||||
@@ -4210,19 +4237,14 @@ class Over(ColumnElement[_T]):
|
||||
_literal_as_text_role=roles.ByOfRole,
|
||||
)
|
||||
|
||||
if range_:
|
||||
self.range_ = self._interpret_range(range_)
|
||||
if rows:
|
||||
raise exc.ArgumentError(
|
||||
"'range_' and 'rows' are mutually exclusive"
|
||||
)
|
||||
else:
|
||||
self.rows = None
|
||||
elif rows:
|
||||
self.rows = self._interpret_range(rows)
|
||||
self.range_ = None
|
||||
if sum(bool(item) for item in (range_, rows, groups)) > 1:
|
||||
raise exc.ArgumentError(
|
||||
"only one of 'rows', 'range_', or 'groups' may be provided"
|
||||
)
|
||||
else:
|
||||
self.rows = self.range_ = None
|
||||
self.range_ = self._interpret_range(range_) if range_ else None
|
||||
self.rows = self._interpret_range(rows) if rows else None
|
||||
self.groups = self._interpret_range(groups) if groups else None
|
||||
|
||||
def __reduce__(self):
|
||||
return self.__class__, (
|
||||
@@ -4231,6 +4253,7 @@ class Over(ColumnElement[_T]):
|
||||
self.order_by,
|
||||
self.range_,
|
||||
self.rows,
|
||||
self.groups,
|
||||
)
|
||||
|
||||
def _interpret_range(
|
||||
@@ -4345,6 +4368,7 @@ class WithinGroup(ColumnElement[_T]):
|
||||
order_by: Optional[_ByArgument] = None,
|
||||
rows: Optional[typing_Tuple[Optional[int], Optional[int]]] = None,
|
||||
range_: Optional[typing_Tuple[Optional[int], Optional[int]]] = None,
|
||||
groups: Optional[typing_Tuple[Optional[int], Optional[int]]] = None,
|
||||
) -> Over[_T]:
|
||||
"""Produce an OVER clause against this :class:`.WithinGroup`
|
||||
construct.
|
||||
@@ -4359,6 +4383,7 @@ class WithinGroup(ColumnElement[_T]):
|
||||
order_by=order_by,
|
||||
range_=range_,
|
||||
rows=rows,
|
||||
groups=groups,
|
||||
)
|
||||
|
||||
@overload
|
||||
@@ -4476,6 +4501,7 @@ class FunctionFilter(Generative, ColumnElement[_T]):
|
||||
] = None,
|
||||
range_: Optional[typing_Tuple[Optional[int], Optional[int]]] = None,
|
||||
rows: Optional[typing_Tuple[Optional[int], Optional[int]]] = None,
|
||||
groups: Optional[typing_Tuple[Optional[int], Optional[int]]] = None,
|
||||
) -> Over[_T]:
|
||||
"""Produce an OVER clause against this filtered function.
|
||||
|
||||
@@ -4501,6 +4527,7 @@ class FunctionFilter(Generative, ColumnElement[_T]):
|
||||
order_by=order_by,
|
||||
range_=range_,
|
||||
rows=rows,
|
||||
groups=groups,
|
||||
)
|
||||
|
||||
def within_group(
|
||||
@@ -4769,11 +4796,11 @@ class Label(roles.LabeledColumnExprRole[_T], NamedColumn[_T]):
|
||||
return self
|
||||
|
||||
@property
|
||||
def primary_key(self):
|
||||
def primary_key(self): # type: ignore[override]
|
||||
return self.element.primary_key
|
||||
|
||||
@property
|
||||
def foreign_keys(self):
|
||||
def foreign_keys(self): # type: ignore[override]
|
||||
return self.element.foreign_keys
|
||||
|
||||
def _copy_internals(
|
||||
@@ -4906,7 +4933,7 @@ class ColumnClause(
|
||||
_is_multiparam_column = False
|
||||
|
||||
@property
|
||||
def _is_star(self):
|
||||
def _is_star(self): # type: ignore[override]
|
||||
return self.is_literal and self.name == "*"
|
||||
|
||||
def __init__(
|
||||
|
||||
Reference in New Issue
Block a user