_SerializedPath = List[Any]
-
+_StrPathToken = str
_PathElementType = Union[
- str, "_InternalEntityType[Any]", "MapperProperty[Any]"
+ _StrPathToken, "_InternalEntityType[Any]", "MapperProperty[Any]"
]
# the representation is in fact
return id(self)
@overload
- def __getitem__(self, entity: str) -> TokenRegistry:
+ def __getitem__(self, entity: _StrPathToken) -> TokenRegistry:
...
@overload
def __getitem__(
self,
entity: Union[
- str, int, slice, _InternalEntityType[Any], MapperProperty[Any]
+ _StrPathToken,
+ int,
+ slice,
+ _InternalEntityType[Any],
+ MapperProperty[Any],
],
) -> Union[
TokenRegistry,
is_aliased_class: bool
is_root: bool
- def token(self, token: str) -> TokenRegistry:
+ def token(self, token: _StrPathToken) -> TokenRegistry:
if token.endswith(f":{_WILDCARD_TOKEN}"):
return TokenRegistry(self, token)
elif token.endswith(f":{_DEFAULT_TOKEN}"):
) -> Union[TokenRegistry, AbstractEntityRegistry]:
if entity in PathToken._intern:
if TYPE_CHECKING:
- assert isinstance(entity, str)
+ assert isinstance(entity, _StrPathToken)
return TokenRegistry(self, PathToken._intern[entity])
else:
try:
inherit_cache = True
- token: str
+ token: _StrPathToken
parent: CreatesToken
- def __init__(self, parent: CreatesToken, token: str):
+ def __init__(self, parent: CreatesToken, token: _StrPathToken):
token = PathToken.intern(token)
self.token = token
from .base import InspectionAttr
from .interfaces import LoaderOption
from .path_registry import _DEFAULT_TOKEN
+from .path_registry import _StrPathToken
from .path_registry import _WILDCARD_TOKEN
from .path_registry import AbstractEntityRegistry
from .path_registry import path_is_property
from ..sql.cache_key import CacheKey
-_AttrType = Union[str, "QueryableAttribute[Any]"]
+_AttrType = Union[Literal["*"], "QueryableAttribute[Any]"]
_WildcardKeyType = Literal["relationship", "column"]
_StrategySpec = Dict[str, Any]
def create(
cls,
path: PathRegistry,
- attr: Optional[_AttrType],
+ attr: Union[_AttrType, _StrPathToken, None],
strategy: Optional[_StrategyKey],
wildcard_key: Optional[_WildcardKeyType],
local_opts: Optional[_OptsType],
from __future__ import annotations
from sqlalchemy import ForeignKey
+from sqlalchemy import orm
from sqlalchemy import select
from sqlalchemy.orm import aliased
from sqlalchemy.orm import DeclarativeBase
id: Mapped[int] = mapped_column(primary_key=True)
a_id: Mapped[int] = mapped_column(ForeignKey("a.id"))
data: Mapped[str]
+ a: Mapped[A] = relationship()
def test_9669_and() -> None:
def test_9669_of_type() -> None:
ba = aliased(B)
select(A).options(selectinload(A.bs.of_type(ba)))
+
+
+def load_options_ok() -> None:
+ select(B).options(
+ orm.contains_eager("*").contains_eager(A.bs),
+ orm.load_only("*").load_only(A.bs),
+ orm.joinedload("*").joinedload(A.bs),
+ orm.subqueryload("*").subqueryload(A.bs),
+ orm.selectinload("*").selectinload(A.bs),
+ orm.lazyload("*").lazyload(A.bs),
+ orm.immediateload("*").immediateload(A.bs),
+ orm.noload("*").noload(A.bs),
+ orm.raiseload("*").raiseload(A.bs),
+ orm.defaultload("*").defaultload(A.bs),
+ orm.defer("*").defer(A.bs),
+ orm.undefer("*").undefer(A.bs),
+ )
+ select(B).options(
+ orm.contains_eager(B.a).contains_eager("*"),
+ orm.load_only(B.a).load_only("*"),
+ orm.joinedload(B.a).joinedload("*"),
+ orm.subqueryload(B.a).subqueryload("*"),
+ orm.selectinload(B.a).selectinload("*"),
+ orm.lazyload(B.a).lazyload("*"),
+ orm.immediateload(B.a).immediateload("*"),
+ orm.noload(B.a).noload("*"),
+ orm.raiseload(B.a).raiseload("*"),
+ orm.defaultload(B.a).defaultload("*"),
+ orm.defer(B.a).defer("*"),
+ orm.undefer(B.a).undefer("*"),
+ )
+
+
+def load_options_error() -> None:
+ select(B).options(
+ # EXPECTED_MYPY_RE: Argument 1 to .* has incompatible type .*
+ orm.contains_eager("foo"),
+ # EXPECTED_MYPY_RE: Argument 1 to .* has incompatible type .*
+ orm.load_only("foo"),
+ # EXPECTED_MYPY_RE: Argument 1 to .* has incompatible type .*
+ orm.joinedload("foo"),
+ # EXPECTED_MYPY_RE: Argument 1 to .* has incompatible type .*
+ orm.subqueryload("foo"),
+ # EXPECTED_MYPY_RE: Argument 1 to .* has incompatible type .*
+ orm.selectinload("foo"),
+ # EXPECTED_MYPY_RE: Argument 1 to .* has incompatible type .*
+ orm.lazyload("foo"),
+ # EXPECTED_MYPY_RE: Argument 1 to .* has incompatible type .*
+ orm.immediateload("foo"),
+ # EXPECTED_MYPY_RE: Argument 1 to .* has incompatible type .*
+ orm.noload("foo"),
+ # EXPECTED_MYPY_RE: Argument 1 to .* has incompatible type .*
+ orm.raiseload("foo"),
+ # EXPECTED_MYPY_RE: Argument 1 to .* has incompatible type .*
+ orm.defaultload("foo"),
+ # EXPECTED_MYPY_RE: Argument 1 to .* has incompatible type .*
+ orm.defer("foo"),
+ # EXPECTED_MYPY_RE: Argument 1 to .* has incompatible type .*
+ orm.undefer("foo"),
+ )
+ select(B).options(
+ # EXPECTED_MYPY_RE: Argument 1 to .* has incompatible type .*
+ orm.contains_eager(B.a).contains_eager("bar"),
+ # EXPECTED_MYPY_RE: Argument 1 to .* has incompatible type .*
+ orm.load_only(B.a).load_only("bar"),
+ # EXPECTED_MYPY_RE: Argument 1 to .* has incompatible type .*
+ orm.joinedload(B.a).joinedload("bar"),
+ # EXPECTED_MYPY_RE: Argument 1 to .* has incompatible type .*
+ orm.subqueryload(B.a).subqueryload("bar"),
+ # EXPECTED_MYPY_RE: Argument 1 to .* has incompatible type .*
+ orm.selectinload(B.a).selectinload("bar"),
+ # EXPECTED_MYPY_RE: Argument 1 to .* has incompatible type .*
+ orm.lazyload(B.a).lazyload("bar"),
+ # EXPECTED_MYPY_RE: Argument 1 to .* has incompatible type .*
+ orm.immediateload(B.a).immediateload("bar"),
+ # EXPECTED_MYPY_RE: Argument 1 to .* has incompatible type .*
+ orm.noload(B.a).noload("bar"),
+ # EXPECTED_MYPY_RE: Argument 1 to .* has incompatible type .*
+ orm.raiseload(B.a).raiseload("bar"),
+ # EXPECTED_MYPY_RE: Argument 1 to .* has incompatible type .*
+ orm.defaultload(B.a).defaultload("bar"),
+ # EXPECTED_MYPY_RE: Argument 1 to .* has incompatible type .*
+ orm.defer(B.a).defer("bar"),
+ # EXPECTED_MYPY_RE: Argument 1 to .* has incompatible type .*
+ orm.undefer(B.a).undefer("bar"),
+ )