发布于2019-09-04 18:05 阅读(626) 评论(0) 点赞(22) 收藏(5)
我已经看到了SessionMaker的很多问题,但是这个问题略有不同。不知道为什么,但sqlalchemy不会让我的会话对象提交。
在我的应用程序中,我有一些代码可以:
views.py
rec = session.query(Records).filter(Records.id==r).first()
n = rec.checkoutRecord(current_user.id)
session.add(n)
session.commit()
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
该程序在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'
该项目的完整代码位于github:https: //github.com/bhoward00/peercoui
任何建议表示赞赏
是的,当使用flask-sqlalchemy
混合纯sqlalchemy
会话的模型时,这是完全正确的问题。事情是从flask-sqlalchemy
基础子类化并添加一些内部结构,其中一个是dict。该字典用于模型修改跟踪。Session
sqlalchemy
_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
我和你有同样的问题,所以希望这对你有所帮助。
更新:
有新版本,应该修复此行为,引用2.0文档:
更改了内置信号的订阅方式,以跳过非Flask-SQLAlchemy会话。这也将修复关于不存在的模型更改的属性错误。
文件:http://flask-sqlalchemy.pocoo.org/2.0/changelog/#version-2-0
作者:黑洞官方问答小能手
链接:https://www.pythonheidong.com/blog/article/90362/196871dc898cd92e927b/
来源:python黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 python黑洞网 All Rights Reserved 版权所有,并保留所有权利。 京ICP备18063182号-1
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!