美文网首页flask web学习
关于flask-sqlalchemy中数据库操作的问题整理

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

作者: 为谁守专一 | 来源:发表于2016-08-25 09:19 被阅读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

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

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

相关文章

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

    此文为本人原创,最早发布于求助《Flask Web 开发》第五章关于数据库db.session.add()和db....

  • python day45_Flask入门

    数据库基本操作 在Flask-SQLAlchemy中,插入、修改、删除操作,均由数据库会话管理。 会话用 db.s...

  • Python学习

    flask-sqlalchemy数据库操作(一) flask默认情况下是不支持数据库操作的。所以我们操作数据库的话...

  • Flask--扩展包

    Flask-SQLalchemy:操作数据库Flask-migrate:管理迁移数据库Flask-Mail:邮件F...

  • Python学习

    flask-sqlalchemy数据库操作(二) 1、数据查询 如何从数据库取回数据呢,使用模型类提供的query...

  • Flask-SQLAlchemy

    1.数据库 1. Flask-SQLAlchemy管理数据库 Flask-SQLAlchemy 是一个 Flask...

  • Flask-SQLAlchemy详解

    flask中一般使用flask-sqlalchemy来操作数据库,使用起来比较简单,易于操作。 安装 配置 操作数...

  • Python学习

    flask-sqlalchemy数据库多表操作(四) 1、参数配置 对数据库连接字符串等信息进行配置,这里以类的形...

  • Python学习

    flask-sqlalchemy数据库单表操作(三) 1、参数配置 对数据库连接字符串等信息进行配置,这里以类的形...

  • Flask-SQLAlchemy CRUD

    当我们习惯 Flask-SQLAlchemy 对数据库进行 CRUD 操作后,就很难再回到基于原生 SQL 的代码...

网友评论

  • fondoger:1. 拼写错误. SQLALCHEMY_COMMIT_ON_TEARDOWN 而非SQLALCHEMY_ON_TEARDOWN.
    2. SQLALCHEMY_COMMIT_ON_TEARDOWN是被去除了, 而非用SQLALCHEMY_TRACK_MODIFICATIONS代替.
    参见: https://github.com/mitsuhiko/flask-sqlalchemy/issues/216
    后者的作用参见:http://flask-sqlalchemy.pocoo.org/2.1/signals/
    为谁守专一:感谢指正, typo 已修改.
  • 883ac7d5b75c:描述下我的问题:
    按照第五章 python xxx.py shell之后 直接进入debug,没法用shell命令行进行各种操作,博主有碰到过这个问题么?
    为谁守专一:@90后码农 你好, 你的问题我没有十分理解. 首先你说进入了 debug, 是指进入 flask-script 提供的 shell 模式了吧? 那等于说是一个普通的 python shell 界面, 只是预载了 flask 的环境. 你说的各种操作具体是哪一类呢? 比如简单的 1+1 可以返回结果吗?
  • 轩辕宇复:请教一下,我写的网站在用户注册或者更改密码是提示:InvalidRequestError: Object '<User at 0x4e60048>' is already attached to session '4' (this is '5'),这个问题怎么解决呢?
    轩辕宇复:@为谁守专一 好的 非常感谢
    为谁守专一:你好, 这个问题我没有遇到过,可能不能很好的解答, 只能帮你一起想想可能性了. 看报错情况, 结合以下两个提问: [InvalidRequestError: Object '' is already attached to session](http://stackoverflow.com/questions/22110757/invalidrequesterror-object-is-already-attached-to-session) 以及 [SQLAlchemy Object already attached to session](http://stackoverflow.com/questions/24291933/sqlalchemy-object-already-attached-to-session), 我认为有可能你的 session 在 db.session.add(user) 之后没有正常关闭, 你可以看看你的 config.py 中有没有正确设置 `SQLALCHEMY_COMMIT_ON_TEARDOWN = True`. 你可以顺着这个思路看看, 是哪里导致的 session 冲突.
    轩辕宇复:我找了好多资料,还是没能得到解决,看了一些sqlalchemy的教程,但是现在还不知道怎么结合到这个大框架中去
  • sunlin1234:请教一下哈,我想写个纯后台的登录注册
    为谁守专一:你好,看得到有点晚。时间比较长了,具体细节我不是太记得了,微博提供了相应的SDK,你可以看看微博的相关文档。纯后台的话你只要拿API就可以的吧?应该有相应的文档。
    sdk你可以看下我的github:https://github.com/jtr109/ToDo/blob/master/app/templates/auth/login.html
    具体的用时间我有时间看看再给你消息吧~
  • sunlin1234:你的那个登录注册的接口是怎么给提供的

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

本文链接:https://www.haomeiwen.com/subject/augosttx.html