背景
在一个基于Flask的项目中,使用到flask-sqlachemy的数据库orm工具。在一次数据插入之后再次查询数据时出现了如下的错误:
1 | DetachedInstanceError: Instance <User at 0x7f2f54fc8750> is not bound to a Session; attribute refresh operation cannot proceed |
原因
经查,由于之前开发的时候,参考《Flask Web开发 基于Python的Web应用开发实战》这本书时,作者建议在配置flask-sqlachemy
时,加入如下配置:
1 | SQLALCHEMY_COMMIT_ON_TEARDOWN = Ture |
这个配置是用来涉及在db操作时,自动提交的。以下两种情况是等效的。
1 | # SQLALCHEMY_COMMIT_ON_TEARDOWN = True 时 |
但其实自动提交时,系统会一并删除当前数据库的session
,所以导致了上面出现的问题。目前flask-sqlachemy
官方也认为这个设置可能存在问题,已经在文档中移除了。
http://flask-sqlalchemy.pocoo.org/2.3/changelog/
结论
那么建议的方法就是删除这条配置,手动提交了。在每次进行数据库新增、修改、删除时,手动的commit()
。