预期类型 'Mapped[bool | None]',改为 'bool' - IDE 警告转换为 SQLAlchemy 2.0 声明式样式

dan*_*d22 7 python warnings sqlalchemy pycharm

我正在努力将项目的数据库部分从 SQLAlchemy 1.4 过渡到 2.0。我正在尝试使用新版本中推荐的 Mapped 类和mapped_column 格式(而不是 Column() 格式......尽管我意识到这应该在可预见的未来继续有效)。但是,当我执行此操作时,我会在编辑这些值的类方法中收到 IDE 警告。

这是一些显示警告的简化代码:

from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
from typing import Optional


class SQLAlchemyBase(DeclarativeBase):
    pass


class TestModel(SQLAlchemyBase):
    __tablename__ = "my_table"

    id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
    my_string: Mapped[str]
    yes_no: Mapped[Optional[bool]]

    def my_method(self):
        self.yes_no = True
        self.my_string = "abc"
Run Code Online (Sandbox Code Playgroud)

我在 IDE (PyCharm 2023.1.1) 中收到的错误是最后两行,它们是:

self.yes_no = True Expected type 'Mapped[bool | None]', got 'bool' instead

self.my_string = "abc" Expected type 'Mapped[str]', got 'str' instead

我理解为什么会发生警告,因为 Mapped[bool] 显然不是 bool,但这不是预期的行为。另外,一切都正常,所以也许我只是强迫症。我还知道有几种方法可以抑制警告。然而,我收到警告的事实让我觉得我做错了事,最终会反咬我一口。

我的映射不正确吗?我应该使用self.yes_no = Mapped[True],它有效,但看起来很愚蠢和过度。将方法放入这些基于 DeclarativeBase 的类中是否只是一种不好的形式?

我已经浏览了 SQLAlchemy 文档,但它们的示例均不包含方法,因此我无法找到答案。