SQLAlchemy 引擎和会话对象的类型提示

问题描述 投票:0回答:2

我正在尝试向我的 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
变量应该是什么类型?

python sqlalchemy python-typing mypy
2个回答
50
投票

弄清楚了:

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

6
投票

如果您像我一样在尝试弄清楚如何注释 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 版发布后将包含新的构造 这将允许构建声明性映射 这将支持直接正确输入,而不需要 插件。

© www.soinside.com 2019 - 2024. All rights reserved.