Python 如何知道是否可以禁用SQLALCHEMY\u TRACK\u修改?

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

每次我运行使用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 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
允许您禁用修改跟踪系统

改变的理由有三个方面:

  • 没有多少人使用Alchemy的事件系统,但大多数人没有意识到禁用它可以节省系统资源。因此,一个更明智的默认设置是禁用它,而那些想要它的人可以打开它

  • Flask SQLAlchemy中的事件系统有相当多的bug(请参阅下面提到的pull请求中的相关问题),需要对很少有人使用的功能进行额外维护

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


  • 您可以在讨论中看到更多内容。

    杰夫·维德曼的详细解释非常完美

    因为我有一些复制'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