V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
p8p8
V2EX  ›  Python

sqlalchemy 里的 session 具体有什么作用?

  •  1
     
  •   p8p8 · 2014-11-20 14:51:25 +08:00 · 4498 次点击
    这是一个创建于 3654 天前的主题,其中的信息可能已经有所发展或是发生改变。
    看了sqlalchemy的源码,看得糊里糊涂的,始终没搞懂sqlalchemy的session是派什么用场的,什么场景下最适合用,最应该用!望大小牛不啬赐教!
    8 条回复    2018-09-28 11:21:00 +08:00
    wy315700
        1
    wy315700  
       2014-11-20 15:00:24 +08:00
    http://docs.sqlalchemy.org/en/rel_0_9/orm/session.html

    看看官方教程吧,说的非常详细了
    tini8
        2
    tini8  
       2014-11-20 15:08:54 +08:00   ❤️ 1
    泼瓢冷水,用sqlalchemy还不如用原生sql。使用ORM工具就是为了方便,sqlalchemy繁琐到还不如原生sql方便了,学习成本很高。

    django的orm在方便和复杂度之间平衡的很好。对于orm无法实现的查询,django官方的建议是使用原生sql。sqlalchemy的愿景是使用orm实现所有可能的sql查询,导致sqlalchemy极度臃肿。
    skywalker
        3
    skywalker  
       2014-11-20 16:44:05 +08:00
    楼上用sqlalchemy也可以不用orm直接用core啊,这样就不用session了。
    p8p8
        4
    p8p8  
    OP
       2014-11-20 19:27:04 +08:00
    我迟早要弃用它!
    awanabe
        5
    awanabe  
       2014-11-20 20:45:37 +08:00
    简单来说就是连接池的抽象吧. 一个session保持一个connect. 保持session就可以减少重复连接数据库的消耗, 也可以避免创建过多连接而造成连接池爆掉.
    session是不可以用于多线程的. 这个踩过坑
    JoeShu
        6
    JoeShu  
       2014-11-21 00:31:28 +08:00
    不明白什么情况下需要用sqlalchemy, 复杂而且又难用。原生的sql多简洁,而且PooledDB就可以解决连接池的问题啊。
    hotea
        7
    hotea  
       2018-09-28 11:18:31 +08:00
    是为了便于手动提交实现事物控制吧
    hotea
        8
    hotea  
       2018-09-28 11:21:00 +08:00
    参考一个 segmentfault 的回答: https://segmentfault.com/q/1010000000698181

    在 SQLAlchemy 中一个 Session (可以看作)是一个 transaction,每个操作(基本上)对应一条或多条 SQL 语句,这些 SQL 语句需要发送到数据库服务器才能被真正执行,而整个 transaction 需要 commit 才能真正生效,如果没提交,一旦你的程序挂了,所有未提交的事务都会被回滚到事务开始之前的状态。
    flush 就是把客户端尚未发送到数据库服务器的 SQL 语句发送过去,commit 就是告诉数据库服务器提交事务。
    简单说,flush 之后你才能在这个 Session 中看到效果,而 commit 之后你才能从其它 Session 中看到效果。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4498 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 05:36 · PVG 13:36 · LAX 21:36 · JFK 00:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.