Mypy plugin and stubs for SQLAlchemy
This package contains type stubs and a mypy plugin to provide more precise static types and type inference for SQLAlchemy framework. SQLAlchemy uses some Python "magic" that makes having precise types for some code patterns problematic. This is why we need to accompany the stubs with mypy plugins. The final goal is to be able to get precise types for most common patterns. Currently, basic operations with models are supported. A simple example:
from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, String Base = declarative_base() class User(Base): __tablename__ = 'users' id = Column(Integer, primary_key=True) name = Column(String) user = User(id=42, name=42) # Error: Incompatible type for "name" of "User" # (got "int", expected "Optional[str]" user.id # Inferred type is "int" User.name # Inferred type is "Column[Optional[str]]"
Some auto-generated attributes are added to models. Simple relationships are supported but require models to be imported:
from typing import TYPE_CHECKING if TYPE_CHECKING: from models.address import Address ... class User(Base): __tablename__ = 'users' id = Column(Integer, primary_key=True) name = Column(String) address = relationship('Address') # OK, mypy understands string references.
The next step is to support precise types for table definitions (e.g.
users.c.name, currently it is just
Column[Any]), and precise types for results of queries made using
To install the latest version of the package:
git clone https://github.com/dropbox/sqlalchemy-stubs cd sqlalchemy-stubs pip install -U .
After the 0.1 version will be released on PyPI, one can install latest stable version as:
pip install -U sqlalchemy-stubs
Important: you need to enable the plugin in your mypy config file:
[mypy] plugins = sqlmypy
First, clone the repo and cd into it, like in Installation, then:
git submodule update --init --recursive pip install -r dev-requirements.txt
Then, to run the tests, simply:
The 0.1 version will be released after we will fix issues #2, #5, and #7. The long term goal is to be able to infer types for more complex situations like correctly inferring columns in most compound queries.
External contributions to the project should be subject to Dropbox Contributor License Agreement (CLA).
Copyright (c) 2018 Dropbox, Inc.