Ensure stubs packages are not installed
Verify if the api is typed
Describe the typing issue
When trying to write code which can run on multiple models, type checking can fail if you use a Union type. This appears to be because the types of columns get reduced from sqlalchemy.orm.attributes.InstrumentedAttribute[<type>] to just <type> (see provided repro for better explanation). I'm not sure if this is an issue with mypy, or the sqlalchemy mypy plugin but the latter seemed more likely to me.
To Reproduce
from typing import Type, Union
from sqlalchemy.orm import DeclarativeBase, Mapped, Session
""" Models """
class ModelBase(DeclarativeBase):
pass
class Model1(ModelBase):
column_a: Mapped[str]
class Model2(ModelBase):
column_a: Mapped[str]
ModelUnionType = Union[Type[Model1], Type[Model2]]
""" Repro """
# these would be provided from elsewhere
session = Session()
model_union: ModelUnionType = Model1
session.query(Model1).filter(Model1.column_a == 'foobar') # ok
session.query(model_union).filter(model_union.column_a == 'foobar') # fails type checking
reveal_type(Model1.column_a)
reveal_type(Model2.column_a)
reveal_type(model_union.column_a)
Error
# Output of mypy running on the repro above
type_test.py:26:35: error: Argument 1 to "filter" of "Query" has incompatible type "bool"; expected
"Union[ColumnElement[bool], _HasClauseElement, SQLCoreOperations[bool], ExpressionElementRole[bool], Callable[[], ColumnElement[bool]], LambdaElement]" [arg-type]
session.query(model_union).filter(model_union.column_a == 'foobar') # fails type checking
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
type_test.py:29:13: note: Revealed type is "sqlalchemy.orm.attributes.InstrumentedAttribute[builtins.str]"
type_test.py:30:13: note: Revealed type is "sqlalchemy.orm.attributes.InstrumentedAttribute[builtins.str]"
type_test.py:31:13: note: Revealed type is "builtins.str"
Found 1 error in 1 file (checked 1 source file)
Versions
- OS: macOS 12.6
- Python: 3.8.13
- SQLAlchemy: 2.0.4
- Type checker: mypy 1.0.1
Additional context
No response
Ensure stubs packages are not installed
sqlalchemy-stubsandsqlalchemy2-stubsare not compatible with v2)Verify if the api is typed
Describe the typing issue
When trying to write code which can run on multiple models, type checking can fail if you use a Union type. This appears to be because the types of columns get reduced from
sqlalchemy.orm.attributes.InstrumentedAttribute[<type>]to just<type>(see provided repro for better explanation). I'm not sure if this is an issue with mypy, or the sqlalchemy mypy plugin but the latter seemed more likely to me.To Reproduce
Error
Versions
Additional context
No response