flask web学习

关于flask-sqlalchemy中数据库操作的问题整理

2016-08-25  本文已影响3574人  为谁守专一

此文为本人原创,最早发布于求助《Flask Web 开发》第五章关于数据库db.session.add()和db.session.commit()问题。内容并不完善,持续更新,可随意转载。转载请标明出处。

问题简述:

当加入了SQLALCHEMY_COMMIT_ON_TEARDOWN=True,在什么情况下仍然要执行db.session.commit()

解答整理如下:

config是在app/__init__.py中调用的,所以执行model.py中的方法时,SQLALCHEMY_COMMIT_ON_TEARDOWN = True已经生效了。即请求结束后自动commit。

后面几个章节中出现db.session.commit()的主要作用都是为了生成id来使用。

你可以结合源码看一下。

session的原理就请参考Flask 源码阅读笔记

SQLALCHEMY_ON_TEARDOWN在flask-sqlalchemy 2.0之后已经被删除了,需要用SQLALCHEMY_TRACK_MODIFICATIONS替代,想必你运行的时候应该看到过相关提示。

参考文章:Flask-SQLAlchemy 配置问题

这个新熟悉我还没掌握,抽空看下documentation再来分析。

继续回到SQLALCHEMY_ON_TEARDOWN。按照书上的说法:

将其设为True时,每次请求结束后都会自动提交数据库中的变动。

因为v1.0的如果这里的documentation已经找不到了,没有依据,我就在这推测一下:

只有当请求结束的时候,才会自动commit,而直接操作数据库是不行的,需要手动commit

回到model.py中看,insert_roles()@staticmethod包装,是一个静态方法,它执行的位置是在python manage.py shell中,而非请求中,所以需要手动commit

你可以验证一下,方法也很简单,保证写入SQLALCHEMY_ON_TEARDONW=True后,在shell中尝试:

>>> user = User(username='test')
>>> db.session.add(user)
>>> quit()

再次进入shell,查找<User u'test'>,不存在,即推断合理:shell中执行的用于操作数据库的方法还是要加commit


我的帖子与回答都会持续更新。如果您觉得有帮助,烦请点个赞,这样或许能帮到其它朋友。

如果我有误导他人的地方,请与我联系,我会及时修改。谢谢!

如果有需要的朋友,可以看看我的website,希望对大家有所帮助。

关于网页中已有的功能都可以和我交流,欢迎查找bug,交流心得。谢谢!

jtr-todo.herokuapp.com

(网站处于测试阶段,请勿保存重要信息,数据丢失概不负责,还请见谅。)

辞职学习中,有工作机会欢迎与我联系,谢谢!

上一篇 下一篇

猜你喜欢

热点阅读