dropbox / dropbox/sqlalchemy-stubs

Deferred columns not recognized as a column

Open
#192 0 comments 3 reactions 0 assignees View on GitHub
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.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.