flask - sqlalchemy.orm.exc.DetachedInstanceError

背景

在一个基于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
2
3
4
5
6
# SQLALCHEMY_COMMIT_ON_TEARDOWN = True 时
db.add(User)

# SQLALCHEMY_COMMIT_ON_TEARDOWN = False 时
db.add(User)
db.commit()

但其实自动提交时,系统会一并删除当前数据库的session,所以导致了上面出现的问题。目前flask-sqlachemy官方也认为这个设置可能存在问题,已经在文档中移除了。

http://flask-sqlalchemy.pocoo.org/2.3/changelog/

结论

那么建议的方法就是删除这条配置,手动提交了。在每次进行数据库新增、修改、删除时,手动的commit()