2015-11-16 21 views
75

Flask-SQLAlchemyを使用するアプリケーションを実行するたびに、SQLALCHEMY_TRACK_MODIFICATIONSオプションが無効になるという警告が表示されます。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.') 

私は、このオプションが何をするかを見つけることを試みたが、フラスコSQLAlchemyのドキュメントは、この追跡を使用するかについては明らかではありません。 Trueに設定した場合

SQLALCHEMY_TRACK_MODIFICATIONS

(デフォルト)フラスコSQLAlchemyのオブジェクトの変更を追跡し、信号を放出します。これは余分なメモリを必要とし、不要な場合は無効にすることができます。私は安全にこの機能を無効にして、私のサーバー上のメモリを節約することができれば私のプロジェクトはSQLALCHEMY_TRACK_MODIFICATIONS = Trueを必要とする場合や、

はどうやって見つけるのですか?

答えて

103

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

フラスコSQLAlchemyのイベントシステムをオフにし(と警告を無効にする)、単に追加するには:

SQLALCHEMY_TRACK_MODIFICATIONS = False 

をアプリの設定にデフォルトが(フラスコSQLAlchemyのv3の中で最も可能性の高い)に変更されるまで。


背景は - ここに警告があなたを語っているものです。

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

私の知る限り理解し、変更の根拠は3倍です:

  1. 多くの人々は、フラスコSQLAlchemyののイベントシステムを使用しますが、ほとんどの人は、彼らがすることで、システムリソースを節約することができます気付いていませんそれを無効にする。したがって、サーナーのデフォルトはそれを無効にすることであり、それを望む人はそ​​れを有効にすることができます。

  2. Flask-SQLAlchemyのイベントシステムはかなりバグがあります(下記のプルリクエストにリンクされている問題を参照)。

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

the pull request that started triggering this warningについての詳細は、こちらをご覧ください。

+1

OK、我々は近づいているが、本当の答えに向けた重要なステップはまだ不足している:どのような関数/メソッド呼び出しは、このことを示していますイベントシステムが使用されていますか? – Robert

+0

答えが更新され、特定のイベントのリストが表示されるようになりました。これらのイベントでgrepしても何も表示されない場合は、おそらく安全です。 –

+6

レコードの場合、TrueまたはFalseに設定したい実際の変数は 'app.config ['SQLALCHEMY_TRACK_MODIFICATIONS']'です。ここでappはflask.Flask()で作成されたフラスコアプリケーションです –

29

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

私はこの権利を得る前にコピーをいくつかコピーしていたので、私はそれを次のシューズに入れるのがより簡単にしたいと思います。それ以外の場合は

app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True 

を、あなたはこの機能を使用してされていない場合、あなたがしたいことがあります。あなたのコードで

、後:あなたはトラックの変更を有効にする場合

app = Flask(__name__) 

簡単にaddシステムリソースを無駄にしないために値をFalseに変更してください。 これは、設定を明示的に設定しているので、警告が消えます。

ここではFalse値と同じ抜粋です:これは提案と詳細を追加するためにジェフWidmanに

app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False 

おかげで。

+2

これは、実際にトラックの変更を有効にする場合にのみ有効です。あなたがそれを使用していないなら、それを 'False'に変更して、システムリソースを無駄にしないようにしたいとします。それでも、明示的に設定を行っているので、警告は消えます。 –

+0

Spot on、@JeffWidman! 詳細を追加しました:) – Pitto

3

上記の回答は良好です。しかし、アプリケーションの設定でSQLALCHEMY_TRACK_MODIFICATIONS = Falseを設定した後も、この警告が表示されていたので、Flask-SQLAlchemyのドキュメントでこの行を指摘しておきたいと思います。このページ

http://flask-sqlalchemy.pocoo.org/2.3/config/

次の設定値がフラスコSQLAlchemyのために存在します。 Flask-SQLAlchemyは、メインのFlask設定からこれらの値を読み込みます。この値はさまざまな方法で設定できます。エンジンの作成後は変更できないので、できるだけ早く設定し、実行時に変更しないようにしてください。言い換えれば

、があなたのフラスコSQLAlchemyのデータベースを作成する前に、あなたのapp.configを設定してください。あなたがあなたのアプリケーションを構成している場合

例えば、SQLALCHEMY_TRACK_MODIFICATIONS = False設定するには:

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

db = SQLAlchemy(app) 
関連する問題