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


136

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

回答:


175

ほとんどの場合、アプリケーションは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のイベントシステムを使用する人は多くありませんが、システムリソースを無効にすることでシステムリソースを節約できることに気付いていない人がほとんどです。したがって、より安全なデフォルトでは無効にしており、必要な人は有効にすることができます。

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

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

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


1
OK、近づきつつありますが、本当の答えへの重要なステップはまだありません。このイベントシステムが使用されていることを示す関数/メソッド呼び出しは何ですか?
ロバート

1
回答を更新して、コードがフックする可能性のある特定のイベントをリストしました...それらをgrepしても何も表示されない場合は、おそらく安全です。
Jeff Widman、2015年

12
レコードについて、この印刷出力を回避するためにTrueまたはFalseに設定する実際の変数はですapp.config['SQLALCHEMY_TRACK_MODIFICATIONS']。ここで、appは作成されたフラスコアプリですflask.Flask()
Michael Hewson

3
一般的にはそうです。ただし、オブジェクトパターンまたはファイルを使用して構成している場合、少し異なる場合があります(フラスコ.pocoo.org / docs / latest / config)。しかし、そうしている場合は、おそらくアプリで変数を構成する方法をすでに知っています。
ジェフウィドマン2016年

72

Jeff Widmanの詳細な説明は完璧です。

私はこれを正しくする前にいくつかのコピーアンドペーストの戦いをしていたので、私の次の戦いが容易になるようにしたいと思います。

あなたのコードでは、直後

app = Flask(__name__)

トラックの変更を有効にしたい場合は、以下を追加してください:

app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True

それ以外の場合、この機能を使用しない場合は、システムリソースを浪費しないように値をFalseに変更することができます。とにかく明示的に構成を設定しているので、これでも警告は表示されません。

これは、False値を持つ同じスニペットです。

app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

この追加の提案と詳細についてJeff Widmanに感謝します。


2
これは、実際にトラックの変更を有効にする場合のみです。それを使用していない場合は、Falseシステムリソースを無駄にしないように変更します。設定を明示的に設定しているため、これでも警告は表示されません。
Jeff Widman、2016

@Pittoこれは私が探していたものです。実際、SQLAlchemyイベントシステムは、ほとんどの部分でスポットされています。Flask-SQLAlchemyの追加は使用されていません。サンプルアプリとして使用しています。サポート終了の警告を作成するようチームに感謝します。本当に役に立ちました。app.config ['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
Doogle

7

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

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

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

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

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

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

db = SQLAlchemy(app)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.