每次我运行使用 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.')
我试图找出这个选项的作用,但是 Flask-SQLAlchemy 文档并不清楚什么使用这个跟踪。
SQLALCHEMY_TRACK_MODIFICATIONS 如果设置为 True(默认),Flask-SQLAlchemy 将跟踪对象的修改并发出信号。这需要额外的内存,如果不需要,可以禁用。
如果设置为 True(默认),Flask-SQLAlchemy 将跟踪对象的修改并发出信号。这需要额外的内存,如果不需要,可以禁用。
如何确定我的项目是否需要SQLALCHEMY_TRACK_MODIFICATIONS = True,或者我是否可以安全地禁用此功能并节省服务器上的内存?
SQLALCHEMY_TRACK_MODIFICATIONS = True
您的应用程序很可能不使用 Flask-SQLAlchemy 事件系统,因此您可以安全地关闭。您需要审核代码以进行验证——您正在寻找任何与models_committed或before_models_committed挂钩的东西。如果你发现你正在使用 Flask-SQLAlchemy 事件系统,你可能应该更新代码以使用 SQLAlchemy 的内置事件系统。
models_committed
before_models_committed
Flask-SQLAlchemy 2.1 的默认值是None,这是一个假值,所以事件系统 是 disabled 。在旧版本中,默认值为True,因此您需要明确禁用它。
None
True
但是,在这两种情况下,在明确设置为 之前,警告不会被静音False。为此,请添加:
False
SQLALCHEMY_TRACK_MODIFICATIONS = False
到您的应用配置。
背景——这是警告告诉你的:
Flask-SQLAlchemy 有自己的事件通知系统,它位于 SQLAlchemy 之上。为此,它会跟踪对 SQLAlchemy 会话的修改。这需要额外的资源,因此该选项SQLALCHEMY_TRACK_MODIFICATIONS允许您禁用修改跟踪系统。
改变的理由有三个:
没有多少人使用 Flask-SQLAlchemy 的事件系统,但大多数人没有意识到他们可以通过禁用它来节省系统资源。因此,更明智的默认设置是禁用它,想要它的人可以打开它。
Flask-SQLAlchemy 中的事件系统相当有问题(请参阅下面提到的拉取请求中链接的问题),需要对很少有人使用的功能进行额外维护。
在 v0.7 中,SQLAlchemy 本身添加了一个强大的事件系统,包括创建自定义事件的能力。理想情况下,Flask-SQLAlchemy 事件系统应该只做一些自定义的 SQLAlchemy 事件钩子和监听器,然后让 SQLAlchemy 自己管理事件触发器。
您可以在围绕开始触发此警告的拉取请求的讨论中看到更多信息。