web-dev-qa-db-ja.com

SQLALCHEMY_TRACK_MODIFICATIONSを無効にできるかどうかはどうすればわかりますか?

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が必要かどうか、またはこの機能を安全に無効にしてサーバーのメモリを節約できるかどうかを確認するにはどうすればよいですか?

106
Robert

ほとんどの場合、アプリケーションはFlask-SQLAlchemyイベントシステムを使用していないため、おそらく安全にオフにできます。検証するためにコードを監査する必要があります- models_committedまたはbefore_models_committed にフックするものを探しています。 Flask-SQLAlchemyイベントシステムを使用していることがわかった場合は、代わりにSQLAlchemyの組み込みイベントシステムを使用するようにコードを更新する必要があります。

Flask-SQLAlchemyイベントシステムをオフ(および警告を無効)にするには、次を追加します。

SQLALCHEMY_TRACK_MODIFICATIONS = False

デフォルトが変更されるまでアプリ設定に追加します(ほとんどの場合、Flask-SQLAlchemy v3で)。


背景-警告が示す内容は次のとおりです。

Flask-SQLAlchemyには、SQLAlchemyの上に階層化される独自のイベント通知システムがあります。これを行うために、SQLAlchemyセッションへの変更を追跡します。これには余分なリソースが必要になるため、オプションSQLALCHEMY_TRACK_MODIFICATIONSを使用すると、変更追跡システムを無効にできます。現在、オプションのデフォルトはTrueですが、将来、そのデフォルトはFalseに変更され、イベントシステムが無効になります。

私が理解している限り、変更の理由は3つあります。

  1. Flask-SQLAlchemyのイベントシステムを使用する人は多くありませんが、ほとんどの人は、システムリソースを無効にすることでシステムリソースを節約できることに気付きません。そのため、sanerのデフォルトでは無効に設定されており、必要な場合は有効にできます。

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

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

この警告をトリガーし始めたプルリクエスト に関する議論で詳細を見ることができます。

141
Jeff Widman

ジェフ・ウィドマンの詳細な説明は完璧です。

これを正しくする前にいくつかのコピーアンドペーストの戦いがあったので、私の靴にある次のもののためにもっと簡単にしたいと思います。

コードでは、直後

app = Flask(__name__)

トラックの変更を有効にするには、次を追加します。

app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True

それ以外の場合、この機能を使用しているnotであれば、システムリソースを無駄にしないために値をFalseに変更できます。とにかく明示的に設定を設定しているので、これは警告を黙らせます。

False値を使用した同じスニペットを次に示します。

app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

この追加された提案と詳細を提供してくれたJeff Widmanに感謝します。

50
Pitto

上記の答えはよく見えます。ただし、アプリケーション構成でSQLALCHEMY_TRACK_MODIFICATIONS = Falseを設定した後でもこれらの警告が表示されるため、Flask-SQLAlchemyのドキュメントでこの行を指摘したかったのです。

このページ: http://flask-sqlalchemy.pocoo.org/2.3/config/

Flask-SQLAlchemyには、次の構成値が存在します。 Flask-SQLAlchemyは、メインのFlask構成からこれらの値をロードし、さまざまな方法で設定できます。これらの一部はエンジンの作成後に変更できないため、できるだけ早く構成し、実行時に変更しないようにしてください。

つまり、Flask-SQLAlchemyデータベースを作成する前にapp.configbeforeを設定してください。

たとえば、SQLALCHEMY_TRACK_MODIFICATIONS = Falseを設定するようにアプリケーションを構成している場合:

from flask import Flask
app = Flask(__name__)
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

db = SQLAlchemy(app)
7
jasonrhaas