问题:我如何知道是否可以禁用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
或者是否可以安全地禁用此功能并在服务器上节省内存?
回答 0
您的应用程序很可能没有使用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
,从而禁用事件系统。
据我了解,更改的理由有三点:
使用Flask-SQLAlchemy的事件系统的人并不多,但是大多数人没有意识到他们可以通过禁用它来节省系统资源。因此,更明智的默认设置是禁用它,想要它的人可以打开它。
Flask-SQLAlchemy中的事件系统存在相当多的错误(请参阅下面提到的请求请求中与之相关的问题),需要为很少有人使用的功能进行额外的维护。
在v0.7中,SQLAlchemy本身添加了一个强大的事件系统,其中包括创建自定义事件的功能。理想情况下,Flask-SQLAlchemy事件系统除了创建一些自定义的SQLAlchemy事件挂钩和侦听器外,无所不用其事,然后让SQLAlchemy自己管理事件触发器。
回答 1
Jeff Widman的详细解释非常完美。
由于在完成此操作之前我曾进行过一些“复制粘贴”的操作,因此我想使下一个穿鞋的操作变得更容易。
在您的代码中,紧接在:
app = Flask(__name__)
如果要启用轨道修改,只需添加:
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
否则,如果您不使用此功能,则可能需要将值更改为False,以免浪费系统资源。由于您仍在显式设置配置,因此这仍然会使警告保持沉默。
这是具有False值的相同代码段:
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
感谢Jeff Widman提出的建议和详细信息。
回答 2
上面的答案看起来不错。但是,我想在Flask-SQLAlchemy文档中指出这一行,因为SQLALCHEMY_TRACK_MODIFICATIONS = False
在我的应用程序配置中设置后,我仍然收到这些警告。
在此页面上:http : //flask-sqlalchemy.pocoo.org/2.3/config/
Flask-SQLAlchemy存在以下配置值。Flask-SQLAlchemy从您的主要Flask配置中加载这些值,可以通过多种方式填充。请注意,其中一些不能在创建引擎后进行修改,因此请确保尽早进行配置,并且不要在运行时进行修改。
换句话说,app.config
在创建Flask-SQLAlchemy数据库之前,请确保设置您的数据库。
例如,如果您将应用程序配置为set SQLALCHEMY_TRACK_MODIFICATIONS = False
:
from flask import Flask
app = Flask(__name__)
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)