Python 如何知道是否可以禁用SQLALCHEMY\u TRACK\u修改?
每次我运行使用Flask SQLAlchemy的应用程序时,我都会收到以下警告,Python 如何知道是否可以禁用SQLALCHEMY\u TRACK\u修改?,python,flask,sqlalchemy,flask-sqlalchemy,Python,Flask,Sqlalchemy,Flask Sqlalchemy,每次我运行使用Flask SQLAlchemy的应用程序时,我都会收到以下警告,SQLAlchemy\u TRACK\u MODIFICATIONS选项将被禁用 /home/david/.virtualenvs/flask-sqlalchemy/lib/python3.5/site-packages/flask_sqlalchemy/__init__.py:800: UserWarning: SQLALCHEMY_TRACK_MODIFICATIONS adds significant over
SQLAlchemy\u TRACK\u 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\u TRACK\u修改
如果设置为True(默认值),Alchemy将跟踪对象的修改并发出信号。这需要额外的内存,如果不需要,可以禁用
如何确定我的项目是否需要
SQLALCHEMY\u TRACK\u MODIFICATIONS=True
,或者我是否可以安全地禁用此功能并在服务器上保存内存?很可能您的应用程序不使用Flask SQLALCHEMY事件系统,因此您可以安全地关闭它。您需要审核代码以进行验证--您正在查找任何与。如果您发现您正在使用Flask SQLAlchemy事件系统,您可能应该更新代码以使用SQLAlchemy的内置事件系统
自Flask SQLAlchemy 2.1起,默认值为None
,这是一个错误值,因此事件系统被禁用。在旧版本中,默认值为True
,因此需要显式禁用它
但是,在这两种情况下,警告都不会静音,直到将其显式设置为False
。为此,请添加:
SQLALCHEMY_TRACK_MODIFICATIONS = False
到您的应用程序配置
背景——以下是警告告诉您的内容: Flask SQLAlchemy有自己的事件通知系统,它在SQLAlchemy之上分层。为此,它跟踪对SQLAlchemy会话的修改。这需要额外的资源,因此选项
SQLALCHEMY\u TRACK\u MODIFICATIONS
允许您禁用修改跟踪系统
改变的理由有三个方面:
您可以在讨论中看到更多内容。杰夫·维德曼的详细解释非常完美 因为我有一些复制'n'粘贴战斗之前,得到这个权利,我想让它更容易为下一个将在我的鞋子 在代码中,紧跟在之后:
app = Flask(__name__)
如果要启用轨迹修改,只需添加:
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
否则,如果不使用此功能,可能需要将该值更改为False,以避免浪费系统资源。
这仍然会使警告静音,因为您正在显式设置配置
以下是相同的代码段,其值为False:
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
感谢Jeff Widman的建议和细节。以上答案看起来不错。但是,我想在Flask SQLAlchemy文档中指出这一行,因为在我的应用程序配置中设置
SQLAlchemy\u TRACK\u MODIFICATIONS=False
之后,我仍然收到这些警告
在本页上:
Alchemy存在以下配置值。Flask SQLAlchemy从您的主Flask配置加载这些值,该配置可以以多种方式填充。请注意,其中一些在创建引擎后无法修改,因此请确保尽早进行配置,并且不要在运行时修改它们
换句话说,在创建您的SQLAlchemy数据库之前,请确保设置您的app.config
例如,如果将应用程序配置为设置SQLALCHEMY\u TRACK\u MODIFICATIONS=False
:
from flask import Flask
app = Flask(__name__)
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
from flask import Flask
app = Flask(__name__)
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
在将应用程序传递给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)
2020年的答案 如果你有这样的问题,那么你肯定不需要这个功能 顺便说一下,最重要的答案已经过时了。从版本2.1(2015年10月23日发布)开始,此配置
SQLALCHEMY\u TRACK\u修改默认为None
。这意味着跟踪行为默认为禁用,您无需担心内存丢失
除非您对终端警告感到烦恼,否则可以通过将其设置为False
来抑制警告:
from flask import Flask
app = Flask(__name__)
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
from flask import Flask
app = Flask(__name__)
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
对于记录,要设置为True或False以避免此打印输出的实际变量是app.config['SQLALCHEMY\u TRACK\u MODIFICATIONS']
,其中app是使用flask.flask()
创建的烧瓶应用程序,通常是正确的;但是,如果使用对象模式或文件进行配置,则可能会有点不同()。但是如果你正在这样做,你可能已经知道如何在你的应用程序中配置变量了。从版本2.1(2015年10月)开始,SQLALCHEMY\u TRACK\u MODIFICATIONS
的默认值是None
,而不是True
。从2020年开始结账。@Pitto这就是我要找的。事实上,SQLAlchemy事件系统在大部分情况下都是正确的。额外的炼金术从未使用过。仅用于示例应用程序。创建弃用警告的团队值得称赞。真的很有帮助。app.config['SQLALCHEMY\u TRACK\u MODIFICATIONS']=False