1. ホーム
  2. python

[解決済み】SQLALCHEMY_TRACK_MODIFICATIONSを無効にする方法は?

2022-02-13 23:11:08

質問事項

Flask-SQLAlchemyを使用したアプリを実行するたびに、以下のような警告が表示されます。 SQLALCHEMY_TRACK_MODIFICATIONS オプションは無効になります。

/home/david/.virtualenvs/flask-sqlalchemy/lib/python3.5/site-packages/flask_sqlalchemy/__init__.py:800: UserWarning: SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and will be disabled by default in the future.  Set it to True to suppress this warning.
  warnings.warn('SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and will be disabled by default in the future.  Set it to True to suppress this warning.')

このオプションが何をするのか調べようとしましたが、Flask-SQLAlchemyのドキュメントでは、このトラッキングが何に使われるのかが明確ではありません。

SQLALCHEMY_TRACK_MODIFICATIONS

True に設定すると(デフォルト)、Flask-SQLAlchemy はオブジェクトの変更を追跡し、シグナルを出します。これは余分なメモリを必要とするので、必要なければ無効にすることができます。

自分のプロジェクトに SQLALCHEMY_TRACK_MODIFICATIONS = True それとも、この機能を安全に無効化して、サーバーのメモリを節約することができますか?

解決方法は?

おそらく、あなたのアプリケーションは Flask-SQLAlchemy のイベントシステムを使用していないので、オフにしても大丈夫でしょう。コードを監査して確認する必要があります。 models_committed または before_models_committed . もし Flask-SQLAlchemy のイベントシステムを使っていることがわかったら、おそらくコードを更新して、代わりに SQLAlchemy の組み込みイベントシステムを使うようにすべきです。

Flask-SQLAlchemy 2.1時点のデフォルト値は None というファルシーな値なので、イベントシステムの は無効です。 . 古いバージョンでは、デフォルト値は True そのため、明示的に無効化する必要があります。

しかし、どちらの場合も、これを明示的に False . そのためには、次のように付け加えます。

SQLALCHEMY_TRACK_MODIFICATIONS = False

をアプリの設定に追加します。


背景--これが警告の内容です。

Flask-SQLAlchemy は独自のイベント通知システムを持っており、SQLAlchemy の上に重ねることができます。そのために、SQLAlchemy のセッションに対する変更を追跡します。これには余分なリソースがかかるので、オプション SQLALCHEMY_TRACK_MODIFICATIONS を使用すると、変更追跡システムを無効にすることができます。

変更の根拠は3つあります。

  1. Flask-SQLAlchemy のイベントシステムを使う人はそれほど多くありませんが、ほとんどの人はそれを無効にすることでシステムリソースを節約できることに気づいていません。だから、より健全なデフォルトは、それを無効にして、必要な人がそれをオンにすることです。

  2. Flask-SQLAlchemy のイベントシステムはかなりバグが多く(後述のプルリクエストにリンクされている問題を参照)、使う人が少ない機能に対して追加のメンテナンスが必要です。

  3. v0.7では、SQLAlchemy自体に 強力なイベントシステム カスタムイベントを作成する機能も含まれています。Flask-SQLAlchemy イベントシステムは、いくつかのカスタム SQLAlchemy イベントフックとリスナーを作成し、 SQLAlchemy 自身にイベントのトリガーを管理させることだけが理想的です。

のあたりのディスカッションで詳しく見ることができます。 この警告を発生させるようになったプルリクエスト .