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

新手上路,请多包涵

我见过很多 SessionMaker 的问题,但这个问题略有不同。不知道为什么,但 sqlalchemy 不会让我的会话对象提交。

在我的应用程序中,我有一些代码可以执行以下操作:

视图.py

 rec = session.query(Records).filter(Records.id==r).first()
n = rec.checkoutRecord(current_user.id)
session.add(n)
session.commit()

模型.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

该程序在 commit() 上崩溃,给出了上述异常。有趣的是,一些不导入 flask 但导入 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'

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

任何建议表示赞赏

原文由 bhoward 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 720
2 个回答

是的,这正是使用 flask-sqlalchemy 模型与纯 sqlalchemy 会话混合时的问题。 Thing is that flask-sqlalchemy subclasses the base Session from sqlalchemy and adds some internals one of which is the _model_changes dict.该字典用于模型修改跟踪。

所以如果你想使用 flask-sqlalchemy 基于模型和常规 sqlalchemy 会话,一种方法是将字典添加到会话(这只是示例代码):

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

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

更新:

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

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

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

原文由 jbub 发布,翻译遵循 CC BY-SA 3.0 许可协议

我也遇到了同样的问题,通过修改 __init__.py 中的 _SessionSignalEvents 类解决了 flask-sqlalchemy 中的类。但是,我刚刚注意到官方存储库上已经有 8 个月的修复程序了。

如果您遇到类似的问题,我建议您从 github ( https://github.com/mitsuhiko/flask-sqlalchemy/ ) 拉取最新版本的项目,因为当前通过 pip install 可用的版本已经过时。

原文由 olipo186 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏