我如何知道我是否可以禁用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_committedbefore_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 ,从而禁用事件系统。

据我所知,改变的理由是三重的:

  1. 使用Flask-SQLAlchemy的事件系统的人并不多,但大多数人并没有意识到他们可以通过禁用它来节省系统资源。 所以一个更好的默认是禁用它,那些想要它可以打开它。

  2. Flask-SQLAlchemy中的事件系统相当麻烦(请参阅下面提到的pull请求中的链接问题),需要额外维护less数人使用的function。

  3. 在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)