Flask報如下錯誤:SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and will be disabled by default in the future. Set it to True or False to suppress this warning.


在同一個項目中由於flask_sqlalchemy版本不同,有時會報如下錯誤

錯誤信息如下:

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.')

錯誤信息提示的很明確,修改 SQLALCHEMY_TRACK_MODIFICATIONS 為True以移除這個警告。

 

去flask/lib/python2.7/site-packages/flask_sqlalchemy的init.py里面修改吧。

 

 


在init.py里面有init_app方法,修改下面的一行:

track_modifications = app.config.setdefault['SQLALCHEMY_TRACK_MODIFICATIONS', True]

然后保存,運行。

 

注意

在后面程序中仍然出現錯誤

>>> from app import db,models
>>> u = models.User(nickname='john', email='john@email.com')
>>> db.session.add(u)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/simufengyun/microblog/flask/lib/python2.7/site-packages/sqlalchemy/orm/scoping.py", line 162, in do
    return getattr(self.registry(), name)(*args, **kwargs)
  File "/Users/simufengyun/microblog/flask/lib/python2.7/site-packages/sqlalchemy/util/_collections.py", line 1012, in __call__
    return self.registry.setdefault(key, self.createfunc())
  File "/Users/simufengyun/microblog/flask/lib/python2.7/site-packages/sqlalchemy/orm/session.py", line 3214, in __call__
    return self.class_(**local_kw)
  File "/Users/simufengyun/microblog/flask/lib/python2.7/site-packages/flask_sqlalchemy/__init__.py", line 137, in __init__
    #track_modifications = app.config['SQLALCHEMY_TRACK_MODIFICATIONS']
KeyError: ('SQLALCHEMY_TRACK_MODIFICATIONS', True)

圖示如下

 

 

請參考如下文章進行修改:https://github.com/pallets/flask-sqlalchemy/issues/609 

關於KeyError的錯誤:'SQLALCHEMY_TRACK_MODIFICATIONS'。

# __init__.py
class SignallingSession(SessionBase):

    def __init__(self, db, autocommit=False, autoflush=True, **options):
        #: The application that this session belongs to.
        self.app = app = db.get_app()
        track_modifications = app.config['SQLALCHEMY_TRACK_MODIFICATIONS']
        bind = options.pop('bind', None) or db.engine
        binds = options.pop('binds', db.get_binds(app))

        if track_modifications is None or track_modifications:
            _SessionSignalEvents.register(self)

        SessionBase.__init__(
            self, autocommit=autocommit, autoflush=autoflush,
            bind=bind, binds=binds, **options
        )
關鍵字“SQLALCHEMY_TRACK_MODIFICATIONS”不在app.config中,app.config在使用前未初始化。所以我建議稍微改變如下:

剛剛在“self.session = self.create_scoped_session(session_options)”之前初始化了“self.app = app”。
# __init__.py
class SQLAlchemy(object):
    """This class is used to control the SQLAlchemy integration to one
    or more Flask applications.  Depending on how you initialize the
    object it is usable right away or will attach as needed to a
    Flask application.
    ... ... ...
    .. versionchanged:: 3.0
       Utilise the same query class across `session`, `Model.query` and `Query`.
    """

    #: Default query class used by :attr:`Model.query` and other queries.
    #: Customize this by passing ``query_class`` to :func:`SQLAlchemy`.
    #: Defaults to :class:`BaseQuery`.
    Query = None

    def __init__(self, app=None, use_native_unicode=True, session_options=None,
                 metadata=None, query_class=BaseQuery, model_class=Model):
        self.app = app
        self.use_native_unicode = use_native_unicode
        self.Query = query_class
        self.session = self.create_scoped_session(session_options)
        self.Model = self.make_declarative_base(model_class, metadata)
        self._engine_lock = Lock()
        # self.app = app

        _include_sqlalchemy(self, query_class)

        if app is not None:
            self.init_app(app)
添加代碼:
        if self.app is not None:
            return self.app
代碼之前:

        if current_app:
            return current_app._get_current_object()
如下:

# __init__.py

    def get_app(self, reference_app=None):
        """Helper method that implements the logic to look up an
        application."""

        if reference_app is not None:
            return reference_app

        if self.app is not None:
            return self.app

        if current_app:
            return current_app._get_current_object()

        # if self.app is not None:
        #   return self.app

        raise RuntimeError(
            'No application found. Either work inside a view function or push'
            ' an application context. See'
            ' http://flask-sqlalchemy.pocoo.org/contexts/.'
        )
這樣,“self.app = app = db.get_app()”將返回實例參數“app”通過“SQLAlchemy(app)”傳輸,而不是引發錯誤。

因為,代碼中的“self.app”

        if self.app is not None:
            return self.app
不會是None,也不會出錯。

現在我們可以在使用“db = SQLAlchemy(app)”作為下面的代碼之前初始化“app.config”:

#coding:utf8
import pymysql
from flask_sqlalchemy import SQLAlchemy
from flask import Flask

app = Flask(__name__)

app.config["SQLALCHEMY_DATABASE_URI"] = "mysql+pymysql://root:whm@47.x.x.x:3306/artcs_pro"
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = True

db = SQLAlchemy(app)

  注意以上所有修改操作都要重新啟動 flask/bin/python


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM