这个 Pycharm 警告让我发疯:)
def get_player_by_id(session: Session, player_id: int) -> Player:
player = session.query(Player).get(Player, player_id)
return player
不返回任何类型提示警告
def get_player_by_id(session: Session, player_id: int) -> Player:
player = session.query(Player, player_id)
return player
触发可怕的波浪线。
我的理解是“正确”的语法将来会被弃用。任何人都可以帮助澄清我的 IDE 设置或我对正确 sqlAlchemy 语法的误解吗?
谢谢!
看起来你的 PyCharm 配置正确地检测到了潜在的类型错误。让我来解释一下为什么第二个代码片段会触发警告。
问题分析
问题在于这一行:
player = session.query(Player, player_id)
这里,你实际上是在告诉 SQLAlchemy 查询
Player
表并返回
Player
对象和
player_id
值作为一个元组。 这意味着
player
变量将包含一个元组
(Player, int)
,而不是一个
Player
对象,这与你的函数签名中指定的返回类型
-> Player
相矛盾。
解决方案
为了解决这个问题,你需要修改查询以仅返回
Player
对象。 你可以使用
filter_by
方法来实现这一点:
def get_player_by_id(session: Session, player_id: int) -> Player:
player = session.query(Player).filter_by(id=player_id).first()
return player
在这个修正后的代码中:
-
我们使用
filter_by(id=player_id)
来过滤查询结果,只保留id
列等于player_id
的行。 -
我们使用
.first()
方法来获取第一个匹配的Player
对象(如果找到的话)。 如果没有找到匹配的对象,则返回None
。
关于弃用
你提到了“正确”的语法将来会被弃用,但我认为这可能是一个误解。 SQLAlchemy 的查询语法非常灵活,允许你根据需要选择不同的方法。
你在第一个代码片段中使用的
get()
方法仍然是获取单个对象的一种有效方法,并且没有计划弃用它。
总结
总而言之,你的 PyCharm IDE 正常工作,并且正确地识别了你的代码中的潜在类型错误。 通过使用
filter_by
方法修改查询,你可以解决这个问题并确保你的代码类型安全。