我如何知道我是否可以禁用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
或者如果我可以安全地禁用此function并将内存保存在我的服务器上?
很可能你的应用程序不使用Flask-SQLAlchemy事件系统,所以你可能安全的closures。 您需要审核代码来validation – 您正在查找挂钩到models_committed
或before_models_committed
任何before_models_committed
。 如果你发现你正在使用Flask-SQLAlchemy事件系统,你可能应该更新代码来使用SQLAlchemy的内置事件系统。
要closuresFlask-SQLAlchemy事件系统(并禁用警告),只需将SQLALCHEMY_TRACK_MODIFICATIONS = False
添加到您的应用程序configuration中,直到默认设置被更改(很可能在Flask-SQLAlchemy v3中)。
背景 – 这是警告告诉你:
Flask-SQLAlchemy有它自己的事件通知系统,它被分层在SQLAlchemy之上。 为此,它会跟踪对SQLAlchemy会话的修改。 这需要额外的资源,所以选项SQLALCHEMY_TRACK_MODIFICATIONS
允许您禁用修改跟踪系统。 目前该选项默认为True
,但将来,该默认值将变为False
,从而禁用事件系统。
据我所知,改变的理由是三重的:
-
使用Flask-SQLAlchemy的事件系统的人并不多,但大多数人并没有意识到他们可以通过禁用它来节省系统资源。 所以一个更好的默认是禁用它,那些想要它可以打开它。
-
Flask-SQLAlchemy中的事件系统相当麻烦(请参阅下面提到的pull请求中的链接问题),需要额外维护less数人使用的function。
-
在v0.7中,SQLAlchemy本身添加了一个强大的事件系统,包括创build自定义事件的能力。 理想情况下,Flask-SQLAlchemy事件系统应该只是创build一些自定义的SQLAlchemy事件钩子和侦听器,然后让SQLAlchemy自己pipe理事件触发器。
在关于开始触发此警告的pull请求的讨论中,您可以看到更多。
杰夫·维德曼的详细解释是完美的。
因为在做这件事之前,我有一些复制性的战斗,所以我想让下一个更容易做到。
在你的代码之后:
app = Flask(__name__)
如果您想要启用追踪修改,只需添加:
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
否则,如果您不使用此function,则可能需要将该值更改为False,以免浪费系统资源。 这仍然会使警告消失,因为您无论如何都明确地设置configuration。
这是与False值相同的片段:
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
感谢杰夫·维德曼对这个补充的build议和细节。
上面的答案看起来不错。 但是,我想在Flask-SQLAlchemy文档中指出这一行,因为在我的应用程序configuration中设置SQLALCHEMY_TRACK_MODIFICATIONS = False
后,仍然收到这些警告。
在此页面上: http : //flask-sqlalchemy.pocoo.org/2.3/config/
Flask-SQLAlchemy存在以下configuration值。 Flask-SQLAlchemy从主Flaskconfiguration中加载这些值,这些值可以用各种方式填充。 请注意,在创build引擎后,其中一些内容不能被修改,因此请确保尽早configuration,并且不要在运行时修改它们。
换句话说,确保在创buildFlask-SQLAlchemy数据库之前设置你的app.config
。
例如,如果您正在configuration您的应用程序来设置SQLALCHEMY_TRACK_MODIFICATIONS = False
:
from flask import Flask app = Flask(__name__) app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False db = SQLAlchemy(app)