如何让Mypy检测SQLAlchemy Where子句的非重叠类型相等检查?
解决SQLAlchemy + Mypy未检测到类型不匹配的问题
核心原因
SQLAlchemy的Mypy插件默认对Column的类型比较做了宽松处理——因为SQLAlchemy本身支持数据库层面的类型隐式转换,所以即使你用Integer类型的字段和字符串比较,插件不会主动触发"Non-overlapping equality check"错误。
解决办法
1. 启用SQLAlchemy插件的严格相等检查
在你的Mypy配置文件(pyproject.toml或mypy.ini)中添加SQLAlchemy插件的严格相等检查选项:
- 若使用
pyproject.toml:[tool.mypy] plugins = ["sqlalchemy.ext.mypy.plugin"] strict = true [tool.mypy.sqlalchemy] strict_equality = true - 若使用
mypy.ini:[mypy] plugins = sqlalchemy.ext.mypy.plugin strict = True [mypy-sqlalchemy] strict_equality = True
开启该选项后,Mypy会严格校验Column字段与比较值的类型,当Integer类型字段和字符串比较时,就会触发"Non-overlapping equality check"错误。
2. 升级依赖版本
确保你使用的SQLAlchemy和Mypy是最新版本——旧版本的SQLAlchemy Mypy插件可能没有strict_equality配置项。执行以下命令升级:
pip install --upgrade sqlalchemy mypy
3. 代码层面手动校验(临时方案)
如果不想全局开启严格检查,也可以在代码中手动强制类型匹配,让Mypy报错:
from sqlalchemy import select from my_module import Usr from typing import cast # 尝试将字符串转为int会直接触发Mypy类型错误 user_id = cast(int, "test") stmt = select(Usr).where(Usr.id == user_id)
内容的提问来源于stack exchange,提问作者sevan
相关产品推荐
相关产品推荐

