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=johnjohn@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.py162,1)">in do
    return getattr(self.registry(),name)(*args,**kwargs)
  File /Users/simufengyun/microblog/flask/lib/python2.7/site-packages/sqlalchemy/util/_collections.py1012,1)">in __call__
    return self.registry.setdefault(key,self.createfunc())
  File /Users/simufengyun/microblog/flask/lib/python2.7/site-packages/sqlalchemy/orm/session.py3214,1)">return self.class_(**local_kw)
  File /Users/simufengyun/microblog/flask/lib/python2.7/site-packages/flask_sqlalchemy/__init__.py137,1)"> __init__
    #track_modifications = app.config[]
KeyError: (

 

 

请参考如下文章进行修改:https://github.com/pallets/flask-sqlalchemy/issues/609 

关于KeyError的错误:。

# __init__.py
class SignallingSession(SessionBase):

    def __init__(self,db,autocommit=False,autoflush=True,1)">options):
        #: The application that  session belongs to.
        self.app = app = db.get_app()
        track_modifications = app.config[]
        bind = options.pop(bind,None) or db.engine
        binds = options.pop(bindsif track_modifications is None or track_modifications:
            _SessionSignalEvents.register(self)

        SessionBase.__init__(
            self,autocommit=autocommit,autoflush=autoflush,bind=bind,binds=binds,1)">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  across `session`,`Model.query` and `Query`.
    """

    #: Default query  used by :attr:`Model.query` and other queries.
    #: Customize  by passing ``query_class`` to :func:`SQLAlchemy`.
    #: Defaults to ::`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  not None:
            self.init_app(app)
添加代码:
        if self.app  not None:
             self.app
代码之前:

        if current_app:
             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  reference_app

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

         current_app._get_current_object()

        #  not None:
        #    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”

         self.app
不会是None,也不会出错。

现在我们可以在使用“db = SQLAlchemy(app)”作为下面的代码之前初始化“app.config”:

#coding:utf8
import pymysql
 flask_sqlalchemy import SQLAlchemy
 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

相关文章

Jinja2:是Python的Web项目中被广泛应用的模板引擎,是由Pyt...
监听QQ消息并不需要我们写代码,因为市面上已经有很多开源QQ...
【Flask框架】—— 视图和URL总结
python+web+flask轻量级框架的实战小项目。登录功能,后续功...
有了这个就可以配置可信IP,关键是不需要企业认证,个人信息...