LoginSignup
0
0

More than 1 year has passed since last update.

モデルファイルを分けた時でも、SQLAlchemyでいい感じに型チェックする

Posted at

公式の方法だとモデルファイルを分けたときにうまくいかないので、対処方法のまとめ

参考

TL; DR

pip install sqlalchemy[mypy]
pyproject.toml
[tool.mypy]
plugins = ["sqlalchemy.ext.mypy.plugin",]
base.py
from sqlalchemy.orm import declarative_base
Base = declarative_base()
campany.py
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に任せる

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0