我如何知道是不是可以禁用 SQLALCHEMY_TRACK_MODIFICATIONS?

Posted

技术标签:

【中文标题】我如何知道是不是可以禁用 SQLALCHEMY_TRACK_MODIFICATIONS?【英文标题】:How do I know if I can disable SQLALCHEMY_TRACK_MODIFICATIONS?我如何知道是否可以禁用 SQLALCHEMY_TRACK_MODIFICATIONS? 【发布时间】:2016-02-17 17:36:30 【问题描述】:

每次我运行使用 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,或者我是否可以安全地禁用此功能并节省服务器上的内存?

【问题讨论】:

【参考方案1】:

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

Flask-SQLAlchemy 2.1 的默认值为None,这是一个虚假值,因此事件系统被禁用。在旧版本中,默认值为 True,因此您需要明确禁用它。

但是,在这两种情况下,只有将其明确设置为 False,警告才会静音。为此,请添加:

SQLALCHEMY_TRACK_MODIFICATIONS = False

到您的应用配置。


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

Flask-SQLAlchemy 有自己的事件通知系统,它位于 SQLAlchemy 之上。为此,它会跟踪对 SQLAlchemy 会话的修改。这需要额外的资源,因此选项SQLALCHEMY_TRACK_MODIFICATIONS 允许您禁用修改跟踪系统。

改变的理由有三个:

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

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

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

你可以在the pull request that started triggering this warning周围的讨论中看到更多。

【讨论】:

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

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)

【讨论】:

【参考方案3】:

确保在将应用传递给 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)

【讨论】:

【参考方案4】:

Jeff Widman 的详细解释简直完美。

因为在做这件事之前我有过一些复制粘贴的斗争,所以我想让下一场比赛变得更容易。

在您的代码中,紧接着

app = Flask(__name__)

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

app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True

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

这是相同的带有 False 值的 sn-p:

app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

感谢 Jeff Widman 提供的补充建议和详细信息。

【讨论】:

@Pitto 这就是我要找的。事实上,SQLAlchemy 事件系统在其中大部分都是正确的。 Flask-SQLAlchemy 上的附加功能从未使用过。仅用于示例应用程序。感谢团队创建弃用警告。真的很有帮助。 app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False【参考方案5】:

以上答案看起来不错。但是,我想在 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)

【讨论】:

以上是关于我如何知道是不是可以禁用 SQLALCHEMY_TRACK_MODIFICATIONS?的主要内容,如果未能解决你的问题,请参考以下文章

如何知道用户是不是在“设置”->“辅助功能”中禁用了透明度?

如何知道是不是没有更多图片可禁用(nxt/prv)按钮

java spring security,如果登录用户被禁用,如何知道密码是不是错误

如何检测服务器端cookie是不是被禁用

如何禁用 BaseExpandableListAdapter 中某些项目的扩展

单击不是提交按钮后如何禁用html按钮