dropbox / dropbox/sqlalchemy-stubs
Deferred columns not recognized as a column
- Dominant language
- Python
- Stars
- 583
- Forks
- 96
- PR merge metrics
- No merged PRs in 30d
Description
Columns wrapped in `deferred()` are not recognized as a column and are typed as `Any`.
SQLAlchemy docs: https://docs.sqlalchemy.org/en/13/orm/loading_columns.html#deferred-column-loading
```python
from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import deferred
Base = declarative_base()
class Model(Base):
__tablename__ = "models"
id = Column(Integer, primary_key=True)
value = deferred(Column(String, nullable=False))
model = Model(value="test")
reveal_type(Model.value)
reveal_type(model.value)
```
```console
> mypy deferred.py
deferred.py:12: error: Unexpected column "value" for model "Model"
deferred.py:14: note: Revealed type is 'Any'
deferred.py:15: note: Revealed type is 'Any'
Found 1 error in 1 file (checked 1 source file)
> pip freeze
mypy==0.790
mypy-extensions==0.4.3
SQLAlchemy==1.3.20
sqlalchemy-stubs @ git+https://github.com/dropbox/sqlalchemy-stubs.git@55470ceab8149db983411d5c094c9fe16343c58b
typed-ast==1.4.1
typing-extensions==3.7.4.3
```
However, this does work if you type the column manually:
```python
from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import deferred
Base = declarative_base()
class Model(Base):
__tablename__ = "models"
id = Column(Integer, primary_key=True)
value = deferred(Column(String, nullable=False)) # type: Column[str]
model = Model(value="test")
reveal_type(Model.value)
reveal_type(model.value)
```
```console
> mypy deferred.py
deferred.py:14: note: Revealed type is 'sqlalchemy.sql.schema.Column[builtins.str*]'
deferred.py:15: note: Revealed type is 'builtins.str*'
```
Contributor guide
No contributing guide indexed for this repository
Assessment
This issue has not been assessed yet.