0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

responderなどでSQLAlchemyを使っていてPyLintに怒られたとき

Last updated at Posted at 2021-03-27

前置き

responder、FastAPI。
いいですよねぇ。

アルゴリズム書くくらいしか能がないと思っていたPythonでしっかりWebサービスが作れます。
しかし歴史が浅いことと、フルスタックフレームワークでないこともあって若干敷居が高いのか、記事はまだ少ない印象があります。
小ネタですが日本語の回答がなかったので、Pythonマイクロサービスにぎやかしのため投稿しておきます。

現象

SQLAlchemyを利用しているとPyLintに

Instance of 'session' has no 'add' user'

のような感じで怒られる。
VSCodeで実行しているので自動的にLinterは働き、詳しいエラートレースは見ていないが、検索してみるとエラーコードは、E1101らしい。

ちなみにresponderやFastAPIはドキュメントを見る限り、標準でORMの機能を実装していないため、自分で好みのライブラリをimportしてくる必要があり、たまたま自分はresponderとDBの繋ぎ込みにSQLAlchemyを選択した。
したがってresponderに限らず、FastAPIなどのマイクロサービス、生でSQLAlchemyを使用する場合でも同様の現象が発生すると思われる。

RDBMSを使うのは既に人類として認められていないと言われているわけでは無いと信じたい。

解決法

検索すると、

pip install pylint-django

をしろとか

pip install pylint-flask

しろとか言われる。
しかし自分はdjangoを使っているわけでもflaskを使っているわけでもない。
適当に--extension-pkg-whitelistsqlalchemyを入れてみてもヒットしなかった。

結論を言うと、setting.jsonに

"python.linting.pylintArgs": [
    "--load-plugins",
    "pylint_flask_sqlalchemy"
]

を追加すると解決した。

pipとかは要らなかった。
pip freezeでもこのパッケージは存在しないので、新しいpipなりVSCodeとは情報が違うのかも。
あと--load-pluginsのsqlalchemyの引数名分かりにくいよ。
responderやFastAPIではありがちなことだけど、responderで検索しても出てこなくなっちゃうじゃん。
この記事もタイトルにresponderと入れるかどうか迷ったけど、「flaskでSQLAlchemy使っていたらVSCodeに怒られた」とか時代遅れな情報ばかりなので入れることにしました。
フクザツ!

--load-pluginsの引数pylint_flaskに関しては無駄なLinterの挙動を抑えるためresponderでは使わない方がいいと思いますが、flaskな人はこの引数だけでもいけるっぽいです。

※注
この問題は比較的最近も議論されていたようなので環境ややりたいことによって解決方法変わるかもです。
詳細な議論は以下参照。
https://stackoverflow.com/questions/53975234/instance-of-sqlalchemy-has-no-column-member-no-member

あとがき

IDEによるPythonのコード解析は非常に素晴らしいのですが、ライブラリや相対importの相手が見つからないよ問題はなかなか厄介ですね。
まあPythonに限った話では無いと思いますが。

その日のうちに追記

pylint_flask_sqlalchemyでエラーが出なくなったのはいいものの、型付言語のように未使用の変数をチェックしてくれる機能まで除去されていた。
個人的にこれは欲しいところ。
また調べると、pylint_sqlalchemyというプラグインもあるが、これをpipしたりjsonに記述したりしてもflask版との差がわからなかった。

ある程度雑なlintで良ければプラグインで良いかもしれないが、結局のところカレントディレクトリのpylintrcを編集するのが一番なのかもしれない。

個人的には差し当たってresponderの場合、デフォルトに以下の設定を追加するのが幸せなのではないかと思いました。

disable=xxx # 色々
        unused-argument, # コントローラの引数reqなど使わないものが多いので
        invalid-name, # pandasやnumpyなどsnake-caseのルールに合致しない命名が一般的なものが多いため
        missing-docstring, # docstring書かないことも多いので
        no-member # sqlalchemyなどライブラリの読み込みエラーを抑止するため

この辺りはmypyやpyrightとの兼ね合いもあるので個々人の好み。
やはりOSSは普及しなければ。

0
1
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
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?