python - 我如何知道是否可以禁用 SQLALCHEMY_TRACK_MODIFICATIONS?

标签 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

If set to True (the default) Flask-SQLAlchemy will track modifications of objects and emit signals. This requires extra memory and can be disabled if not needed.

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

最佳答案

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

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

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

SQLALCHEMY_TRACK_MODIFICATIONS = False

到您的应用配置。


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

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

改变的理由有三个:

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

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

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

您可以在有关 the pull request that started triggering this warning 的讨论中看到更多信息.

关于python - 我如何知道是否可以禁用 SQLALCHEMY_TRACK_MODIFICATIONS?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33738467/

相关文章:

python - 使用 seaborn clustermap 在层次聚类中提取集群行

python - 通过 scipy.io.loadmat 将 matlab 3D 矩阵传输到 python 3D 数组会出错

python - Python Web 框架中的 HTTP 请求之间如何保留资源?

python - 分配给未映射到 SQLAlchemy 列的属性时如何引发异常?

python - 通过符号链接(symbolic link)启动 python 脚本

flask - 在 VScode 调试器中更改 flask 运行端口

python - 将 Google OAuth2 与 Flask 一起使用

sqlite - Sqlalchemy sqlite url 相对于 home 或环境变量

python - 如何确保与 uWSGI 和 Pyramid 的唯一 SQLAlchemy 数据库连接

python - 使用 UDF 通过使用数据框中的两列来返回列表