sqlalchemy flask:AttributeError:'Session'对象在session.commit()上没有属性'_model_changes'

bho*_*ard 16 python sqlalchemy flask flask-sqlalchemy

我已经看到了SessionMaker的很多问题,但是这个问题略有不同.不知道为什么,但sqlalchemy不会让我的会话对象提交.

在我的应用程序中,我有一些代码可以:

views.py

rec = session.query(Records).filter(Records.id==r).first()
n = rec.checkoutRecord(current_user.id)
session.add(n)
session.commit()
Run Code Online (Sandbox Code Playgroud)

models.py:

class Records(UserMixin, CRUDMixin, Base):
    __table__ = Table('main_records', Base.metadata, autoload=True)


    def checkoutRecord(self,uid):
        self.editing_uid = uid 
        self.date_out = datetime.now()
        return self

    def checkinRecord(self,uid):
        self.editing_uid = uid 
        self.date_in = datetime.now()
        return self
Run Code Online (Sandbox Code Playgroud)

该程序在commit()上解决,给出了上述异常.有趣的是,一些测试代码不导入烧瓶,但导入sqlalchemy工作正常,让我提交没有错误.

完整的堆栈跟踪:

Traceback (most recent call last):
  File "/Users/bhoward/Envs/py27/lib/python2.7/site-packages/flask/app.py", line 1475, in full_dispatch_request
    rv = self.dispatch_request()
  File "/Users/bhoward/Envs/py27/lib/python2.7/site-packages/flask/app.py", line 1461, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/Users/bhoward/Envs/py27/lib/python2.7/site-packages/flask_login.py", line 663, in decorated_view
    return func(*args, **kwargs)
  File "/Users/bhoward/projects/PeerCoUI/mk2/peercoui/app/records/views.py", line 65, in select_view
    session.commit()
  File "/Users/bhoward/Envs/py27/lib/python2.7/site-packages/sqlalchemy/orm/scoping.py", line 149, in do
    return getattr(self.registry(), name)(*args, **kwargs)
  File "/Users/bhoward/Envs/py27/lib/python2.7/site-packages/sqlalchemy/orm/session.py", line 721, in commit
    self.transaction.commit()
  File "/Users/bhoward/Envs/py27/lib/python2.7/site-packages/sqlalchemy/orm/session.py", line 354, in commit
    self._prepare_impl()
  File "/Users/bhoward/Envs/py27/lib/python2.7/site-packages/sqlalchemy/orm/session.py", line 323, in _prepare_impl
    self.session.dispatch.before_commit(self.session)
  File "/Users/bhoward/Envs/py27/lib/python2.7/site-packages/sqlalchemy/event.py", line 372, in __call__
    fn(*args, **kw)
  File "/Users/bhoward/Envs/py27/lib/python2.7/site-packages/flask_sqlalchemy/__init__.py", line 162, in session_signal_before_commit
    d = session._model_changes
AttributeError: 'Session' object has no attribute '_model_changes'
Run Code Online (Sandbox Code Playgroud)

该项目的完整代码位于github:https: //github.com/bhoward00/peercoui

任何建议表示赞赏

jbu*_*bub 23

是的,当使用flask-sqlalchemy混合纯sqlalchemy会话的模型时,这是完全正确的问题.事情是从flask-sqlalchemy基础子类化并添加一些内部结构,其中一个是dict.该字典用于模型修改跟踪.Sessionsqlalchemy_model_changes

因此,如果您想使用flask-sqlalchemy基于常规sqlalchemy会话的模型,一种方法是将dict添加到会话中(这只是示例代码):

def create_session(config):
    engine = create_engine(config['DATABASE_URI'])
    Session = sessionmaker(bind=engine)
    session = Session()
    session._model_changes = {}
    return session 
Run Code Online (Sandbox Code Playgroud)

我和你有同样的问题,所以希望这对你有所帮助.

更新:

有新版本,应该修复此行为,引用2.0文档:

更改了内置信号的订阅方式,以跳过非Flask-SQLAlchemy会话.这也将修复关于不存在的模型更改的属性错误.

文件:http://flask-sqlalchemy.pocoo.org/2.0/changelog/#version-2-0

  • 我遇到了同样的问题,并通过升级SQLAlchemy和Flask-SQLAlchemy解决了这个问题.我有SQLAlchmy(0.9.6)和Flask-SQLAlchemy(1.0)的旧版本.我将SQLAlchemy升级到0.9.8,将Flask-SQLAlchemy升级到2.0.这解决了我的问题.我的环境是Ubuntu 14.04.1 LTS和Python 2.7.6. (3认同)