公式の方法だとモデルファイルを分けたときにうまくいかないので、対処方法のまとめ
参考
-
SQLAlchemyで型チェックをがんばる
型チェック自体はこちらの記事が詳しい
TL; DR
pip install sqlalchemy[mypy]
[tool.mypy]
plugins = ["sqlalchemy.ext.mypy.plugin",]
from sqlalchemy.orm import declarative_base
Base = declarative_base()
from .base import Base
from typing import TYPE_CHECKING
from sqlalchemy impoprt String, Column
if TYPE_CHECKING:
from sqlalchemy.orm import declarative_base
Base = declarative_base()
class Campany(Base):
__tablename__ = "campany"
id: int = Column(Integer, nullable=False, primary_key=True)
name: str = Column(String, nullable=False)
プラグインインストール
pip install sqlalchemy[mypy]
後ろに[mypy]
つけてインストールする必要がある。
mypyの設定
pyproject.tomlにインストールしたプラグインを指定
plugins = ["sqlalchemy.ext.mypy.plugin",]
ここまでで、モデルファイルがひとつだけの場合は型チェックできる。
モデルのファイルを分ける場合
base.pyを作ってBase = declarative_base()
して使いまわすとモデルファイルを複数に分割できるけど、そのままやるとmypyに怒られる。
mypyで型チェックするためには、そのファイル内でBaseを作る必要がある。
そこで、困ったときのTYPE_CHECKING
で型チェック時のみBaseを上書きする
from .base import Base
if TYPE_CHECKING:
from sqlalchemy.orm import declarative_base
Base = declarative_base()
[補足] pyrightでは諦める
sqlalchemy-stubsを入れても
str_var: str = model.str_column
とかすると
"Column[String]" is incompatible with "str (reportGeneralTypeIssues)"
が出てしまう
しばらく前に調べた感じだとSQLAlchemyについては、pyrightではいい感じにやるのは無理そう。
なので、reportGeneralTypeIssues=false
にして型チェックはmypyに任せる