美文网首页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

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

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

    相关文章

      网友评论

      • 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 已修改.
      • 90后码农:描述下我的问题:
        按照第五章 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