我怎么知道我是否可以禁用SQLALCHEMY_TRACK_MODIFICATIONS?

Rob*_*ert 116 python sqlalchemy flask flask-sqlalchemy

每次我运行使用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.')
Run Code Online (Sandbox Code Playgroud)

我试图找出这个选项的作用,但Flask-SQLAlchemy文档并不清楚使用此跟踪的内容.

SQLALCHEMY_TRACK_MODIFICATIONS

如果设置为True(默认值),Flask-SQLAlchemy将跟踪对象的修改并发出信号.这需要额外的内存,如果不需要可以禁用.

如何确定我的项目是否需要,SQLALCHEMY_TRACK_MODIFICATIONS = True或者我是否可以安全地禁用此功能并在我的服务器上保存内存?

Jef*_*man 152

很可能您的应用程序不使用Flask-SQLAlchemy事件系统,因此您可以安全地关闭.您需要审核代码以验证 - 您正在寻找任何挂钩models_committed或的内容before_models_committed.如果您确实发现您正在使用Flask-SQLAlchemy事件系统,则可能应该更新代码以使用SQLAlchemy的内置事件系统.

要关闭Flask-SQLAlchemy事件系统(并禁用警告),只需添加:

SQLALCHEMY_TRACK_MODIFICATIONS = False
Run Code Online (Sandbox Code Playgroud)

到您的应用程序配置,直到更改默认值(很可能在Flask-SQLAlchemy v3中).


背景 - 这是警告告诉您的内容:

Flask-SQLAlchemy有自己的事件通知系统,可以在SQLAlchemy之上进行分层.为此,它跟踪对SQLAlchemy会话的修改.这需要额外的资源,因此该选项SQLALCHEMY_TRACK_MODIFICATIONS允许您禁用修改跟踪系统.目前,该选项默认为True,但将来,默认值将更改为False,从而禁用事件系统.

据我了解,改变的理由是三方面的:

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

  2. Flask-SQLAlchemy中的事件系统非常错误(请参阅下面提到的pull请求中链接的问题),需要对很少人使用的功能进行额外维护.

  3. 在v0.7中,SQLAlchemy本身添加了一个强大的事件系统,包括创建自定义事件的能力.理想情况下,Flask-SQLAlchemy事件系统应该只创建一些自定义SQLAlchemy事件挂钩和侦听器,然后让SQLAlchemy自己管理事件触发器.

您可以在讨论中看到有关启动触发此警告的pull请求的更多信息.

  • 对于记录,要设置为True或False以避免此打印输出的实际变量是`app.config ['SQLALCHEMY_TRACK_MODIFICATIONS']`,其中app是使用`flask.Flask()创建的烧瓶应用程序` (9认同)
  • 一般来说这是真的; 但是,如果您使用对象模式或文件进行配置,则可能会有所不同(http://flask.pocoo.org/docs/latest/config/).但是如果你这样做,你可能已经知道如何在你的应用程序中配置变量. (2认同)
  • 从版本 2.1(2015 年 10 月)开始,“SQLALCHEMY_TRACK_MODIFICATIONS”的默认值为“None”,而不是“True”。查看 2020 年的[答案](/sf/answers/4557118541/)。 (2认同)

Pit*_*tto 63

Jeff Widman的详细解释非常完美.

因为在做到这一点之前我曾经进行了一些抄袭,所以我想让下一个会更容易在我的鞋子里.

在您的代码中,紧接着:

app = Flask(__name__)
Run Code Online (Sandbox Code Playgroud)

如果要启用轨道修改,只需添加:

app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
Run Code Online (Sandbox Code Playgroud)

否则,如果您使用此功能,则可能需要将值更改为False,以免浪费系统资源.这仍然会使警告静音,因为您无论如何都明确设置了配置.

这是与False值相同的代码段:

app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
Run Code Online (Sandbox Code Playgroud)

感谢Jeff Widman提出的更多建议和细节.

  • 仅当您确实要启用轨道修改时才会这样.如果您不使用它,则需要将其更改为"False",这样您就不会浪费系统资源.由于您仍然明确设置配置,因此仍会使警告静音. (2认同)

jas*_*aas 7

以上答案看起来不错.但是,我想在Flask-SQLAlchemy文档中指出这一行,因为SQLALCHEMY_TRACK_MODIFICATIONS = False在我的应用程序配置中设置后我仍然收到这些警告.

在此页面上:http: //flask-sqlalchemy.pocoo.org/2.3/config/

Flask-SQLAlchemy存在以下配置值.Flask-SQLAlchemy从您的主Flask配置加载这些值,可以通过各种方式填充.请注意,其中一些在创建引擎后无法修改,因此请确保尽早配置并且不要在运行时修改它们.

换句话说,确保app.config 创建Flask-SQLAlchemy数据库之前设置好.

例如,如果要配置应用程序以进行设置SQLALCHEMY_TRACK_MODIFICATIONS = False:

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

db = SQLAlchemy(app)
Run Code Online (Sandbox Code Playgroud)


Gre*_* Li 6

2020年的回答

如果您有这样的问题,那么您绝对不需要此功能。

顺便说一句,最重要的答案已经过时了。从 2.1 版(2015 年 10 月 23 日发布)开始,此配置SQLALCHEMY_TRACK_MODIFICATIONS默认为None. 这意味着跟踪行为默认为禁用,您无需担心内存丢失。

除非您对终端警告感到困扰,否则可以通过将其设置为False

from flask import Flask

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

db = SQLAlchemy(app)
Run Code Online (Sandbox Code Playgroud)