添加注册登录功能

This commit is contained in:
2025-08-29 00:34:40 +08:00
parent 09065f2ce7
commit 2fe3474d9e
3060 changed files with 29217 additions and 87137 deletions

View File

@@ -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__(