--- /dev/null
+.. change::
+ :tags: bug, typing
+ :tickets: 10061
+
+ Fixed some of the typing within the :func:`_orm.aliased` construct to
+ correctly accept a :class:`.Table` object that's been aliased with
+ :meth:`.Table.alias`, as well as general support for :class:`.FromClause`
+ objects to be passed as the "selectable" argument, since this is all
+ supported.
@overload
def aliased(
element: Type[_O],
- alias: Optional[Union[Alias, Subquery]] = None,
+ alias: Optional[FromClause] = None,
name: Optional[str] = None,
flat: bool = False,
adapt_on_names: bool = False,
@overload
def aliased(
element: Union[AliasedClass[_O], Mapper[_O], AliasedInsp[_O]],
- alias: Optional[Union[Alias, Subquery]] = None,
+ alias: Optional[FromClause] = None,
name: Optional[str] = None,
flat: bool = False,
adapt_on_names: bool = False,
@overload
def aliased(
element: FromClause,
- alias: Optional[Union[Alias, Subquery]] = None,
+ alias: None = None,
name: Optional[str] = None,
flat: bool = False,
adapt_on_names: bool = False,
def aliased(
element: Union[_EntityType[_O], FromClause],
- alias: Optional[Union[Alias, Subquery]] = None,
+ alias: Optional[FromClause] = None,
name: Optional[str] = None,
flat: bool = False,
adapt_on_names: bool = False,
from ..sql.base import ReadOnlyColumnCollection
from ..sql.elements import BindParameter
from ..sql.selectable import _ColumnsClauseElement
- from ..sql.selectable import Alias
from ..sql.selectable import Select
from ..sql.selectable import Selectable
- from ..sql.selectable import Subquery
from ..sql.visitors import anon_map
from ..util.typing import _AnnotationScanType
from ..util.typing import ArgsTypeProcotol
def _alias_factory(
cls,
element: Union[_EntityType[_O], FromClause],
- alias: Optional[Union[Alias, Subquery]] = None,
+ alias: Optional[FromClause] = None,
name: Optional[str] = None,
flat: bool = False,
adapt_on_names: bool = False,
)
+class JoinedInhTest(
+ InheritedTest, _poly_fixtures._Polymorphic, AssertsCompiledSQL
+):
+ __dialect__ = "default"
+
+ def test_load_only_on_sub_table(self):
+ Company = self.classes.Company
+ Engineer = self.classes.Engineer
+
+ e1 = aliased(Engineer, inspect(Engineer).local_table)
+
+ q = select(Company.name, e1.primary_language).join(
+ Company.employees.of_type(e1)
+ )
+
+ self.assert_compile(
+ q,
+ "SELECT companies.name, engineers.primary_language "
+ "FROM companies JOIN engineers "
+ "ON companies.company_id = people.company_id",
+ )
+
+ def test_load_only_on_sub_table_aliased(self):
+ Company = self.classes.Company
+ Engineer = self.classes.Engineer
+
+ e1 = aliased(Engineer, inspect(Engineer).local_table.alias())
+
+ q = select(Company.name, e1.primary_language).join(
+ Company.employees.of_type(e1)
+ )
+
+ self.assert_compile(
+ q,
+ "SELECT companies.name, engineers_1.primary_language "
+ "FROM companies JOIN engineers AS engineers_1 "
+ "ON companies.company_id = people.company_id",
+ )
+
+
class RawSelectTest(QueryTest, AssertsCompiledSQL):
"""older tests from test_query. Here, they are converted to use
future selects with ORM compilation.
from sqlalchemy import func
from sqlalchemy import insert
from sqlalchemy import Integer
+from sqlalchemy import join
from sqlalchemy import MetaData
from sqlalchemy import Select
from sqlalchemy import select
reveal_type(ts2)
select(User).from_statement(ts2)
+
+
+def t_aliased_fromclause() -> None:
+ a1 = aliased(User, user_table)
+
+ a2 = aliased(User, user_table.alias())
+
+ a3 = aliased(User, join(user_table, user_table.alias()))
+
+ a4 = aliased(user_table)
+
+ # EXPECTED_TYPE: Type[User]
+ reveal_type(a1)
+
+ # EXPECTED_TYPE: Type[User]
+ reveal_type(a2)
+
+ # EXPECTED_TYPE: Type[User]
+ reveal_type(a3)
+
+ # EXPECTED_TYPE: FromClause
+ reveal_type(a4)