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

时间:2015-11-16 15:05:40

标签: python flask sqlalchemy 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.')

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

  

SQLALCHEMY_TRACK_MODIFICATIONS

     

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

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

5 个答案:

答案 0 :(得分:141)

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

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

SQLALCHEMY_TRACK_MODIFICATIONS = False

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

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

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

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

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

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

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

  4. 您可以在围绕the pull request that started triggering this warning的讨论中看到更多内容。

答案 1 :(得分:50)

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

由于我在做正确的事情之前有一些副本粘贴战斗,所以我希望让下一部分更容易。“/ p>

在您的代码中,紧跟在之后:

app = Flask(__name__)

如果您想启用曲目修改,只需添加:

app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True

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

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

app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

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

答案 2 :(得分:7)

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

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

  

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

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

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

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

db = SQLAlchemy(app)

答案 3 :(得分:1)

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)

答案 4 :(得分:0)

在将应用程序传递给SqlAlchemy之前,请确保设置应用程序配置属性。下面是设置与sql server的连接的示例。

import os
from flask import Flask
from flask_sqlalchemy import SQLAlchemy

SECRET_KEY = os.urandom(32)
SERVER = 'MY_DB_SERVER'
DATABASE = 'MY_DB_NAME'
USERNAME = 'MY_DOMAIN\\MY_USERNAME'
PASSWORD = '$ecretsSecretsarenofun...' # the office ref iykyk
DRIVER = 'SQL SERVER'
DATABASE_CONNECTION = f'MSSQL://{USERNAME}:{PASSWORD}@{SERVER}/{DATABASE}?driver={DRIVER};trusted_connection=yes'

app = Flask(__name__)

# set your config properties BEFORE passing the app to SQLAlchemy
app.config['SECRET_KEY'] = SECRET_KEY
app.config['SQLALCHEMY_DATABASE_URI'] = DATABASE_CONNECTION
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

db = SQLAlchemy(app)