我正在尝试向我的 SQLAlchemy 脚本添加类型提示:
connection_string: str = "sqlite:///:memory:"
engine = create_engine(connection_string)
session = Session(bind=engine)
reveal_type(engine)
reveal_type(session)
我已经针对
mypy
运行了这个脚本,但两种类型都以 Any
的形式返回。 engine
和 session
变量应该是什么类型?
弄清楚了:
connection_string: str = "sqlite:///:memory:"
engine = create_engine(connection_string)
session = Session(bind=engine)
print(type(engine)) # sqlalchemy.engine.base.Engine
print(type(session)) # sqlalchemy.orm.session.Session
因此,类型提示是通过以下方式实现的:
from sqlalchemy.engine.base import Engine
def test_func(engine: Engine):
pass
如果您像我一样在尝试弄清楚如何注释 SQLAlchemy 内容时发现了这个问题,那么请按照本指南进行操作。首先,这些是正确的注释:
from sqlalchemy import create_engine
from sqlalchemy.engine import Engine
from sqlalchemy.orm import Session
connection_string: str = "sqlite:///:memory:"
engine: Engine = create_engine(connection_string)
session: Session = Session(bind=engine)
这么简单?不好了!这就是 mypy 现在所说的:
main.py:1: error: Cannot find implementation or library stub for module named "sqlalchemy"
main.py:1: note: See https://mypy.readthedocs.io/en/stable/running_mypy.html#missing-imports
main.py:2: error: Cannot find implementation or library stub for module named "sqlalchemy.engine"
main.py:3: error: Cannot find implementation or library stub for module named "sqlalchemy.orm"
Found 3 errors in 1 file (checked 1 source file)
这是因为 SQLAlchemy 不是静态类型的,因此要使其工作,您需要安装 stub 文件(扩展名为 .pyi 的文件)。幸运的是,有解决方案。如果您使用 SQLAlchemy 1.4+,您可以使用 官方存根,在其他情况下使用 sqlalchemy-stubs 键入 Dropbox 发布的注释。
通过 pip 安装它(或使用任何其他包管理器):
pip install 'sqlalchemy[mypy]'
首先,您需要做的就是创建一个包含以下内容的
mypy.ini
文件:
[mypy]
plugins = sqlalchemy.ext.mypy.plugin
然后通过
mypy main.py
运行它,没有发现任何问题!
考虑到这个 mypy 插件是专门为 SQLAlchemy 1.4-2.x 版本开发的。根据文档:
SQLAlchemy 2.0 版发布后将包含新的构造 这将允许构建声明性映射 这将支持直接正确输入,而不需要 插件。