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
larkifly
V2EX  ›  Python

使用 flask sqlalchemy 时,如何在运行 db.session.commit 前,获取到新添加列的 id

  •  
  •   larkifly · 2015-10-26 10:09:08 +08:00 · 8874 次点击
    这是一个创建于 3351 天前的主题,其中的信息可能已经有所发展或是发生改变。
    例如:
    addr = Address(....)
    db.session.add(addr)
    temp.a_id = addr.id
    db.session.commit()
    这样执行一次 db.session.commit 就可以了,但是这样运行不成功

    我现在是这么写得
    addr = Address(....)
    db.session.add(addr)
    db.session.commit()

    temp.a_id = addr.id
    db.session.commit()
    这样执行两次就可以了。


    问题就是,如何实现类似于上面的那个效果
    21 条回复    2015-10-29 18:54:56 +08:00
    rockivy
        1
    rockivy  
       2015-10-26 10:25:50 +08:00
    关注

    借楼主宝地 , 顺便问一下 :
    一个很简单的 flask + sqlalchemy 应用(无页面, 访问一个 url 返回 json 串),
    在 view 代码的最开始初始化 sqlalchemy session, 供下面的所有 url route 共同使用,

    这种写法是否合适?
    shajiquan
        2
    shajiquan  
       2015-10-26 10:32:28 +08:00
    试试 db.session.flush()
    wayslog
        3
    wayslog  
       2015-10-26 10:51:31 +08:00
    看样子是有主键生成策略的,那么你可以试一下 flush
    ipconfiger
        4
    ipconfiger  
       2015-10-26 11:01:49 +08:00
    先 flush 一下就对了
    shajiquan
        5
    shajiquan  
       2015-10-26 11:12:11 +08:00   ❤️ 1
    @rockivy 不合适。
    shajiquan
        6
    shajiquan  
       2015-10-26 11:28:38 +08:00   ❤️ 1
    larkifly
        7
    larkifly  
    OP
       2015-10-26 12:27:07 +08:00
    @shajiquan 好快,赞
    larkifly
        8
    larkifly  
    OP
       2015-10-26 12:28:14 +08:00
    @shajiquan session.flush()的时候,有实际产生数据库操作吗?
    rockivy
        9
    rockivy  
       2015-10-26 12:30:25 +08:00
    @shajiquan 那正确的姿势可否赐教一下呢? 感谢已发送
    thomaspaine
        10
    thomaspaine  
       2015-10-26 12:38:06 +08:00
    @rockivy 推荐只用一个 session 吧,官方文档貌似有说
    shajiquan
        11
    shajiquan  
       2015-10-26 12:59:08 +08:00
    @larkifly 会的。会刷新数据库缓存。
    shajiquan
        12
    shajiquan  
       2015-10-26 13:00:28 +08:00
    @rockivy 可以创建一个 session poll ,然后每个 request 时去 poll 里取一个。或者, flask.before_request 时创建一个 session , flask.after_request 关闭此 session 。
    rockivy
        13
    rockivy  
       2015-10-26 13:25:29 +08:00
    @thomaspaine 目前的做法就是在 view 的顶部初始化一个 session, 下
    面所有的 url route 中, 数据库的交互都使用了这个 session.
    rockivy
        14
    rockivy  
       2015-10-26 13:26:58 +08:00
    @shajiquan before 和 after request 中创建和关闭 session 的开销大吗?
    这个 session 背后是否有个隐藏的数据库连接池支撑呢?
    shajiquan
        15
    shajiquan  
       2015-10-26 14:43:55 +08:00
    @rockivy 有开销,但还好,就普通的连接而已,你未必会在每个 request 里有大量的事务吧?如果你配置了连接池就会有,反之就没有。
    shajiquan
        16
    shajiquan  
       2015-10-26 14:44:39 +08:00
    @rockivy 你先这么用,出了问题再说。你可以配置一下连接池, max size 之类的。
    rockivy
        17
    rockivy  
       2015-10-26 14:58:33 +08:00
    @shajiquan 了解了, 我先试试看, 感谢!
    shajiquan
        18
    shajiquan  
       2015-10-26 15:15:28 +08:00
    @rockivy 下面两个链接供参考, SA 官方文档:

    Contextual/Thread-local Sessions — SQLAlchemy 1.0 Documentation http://docs.sqlalchemy.org/en/rel_1_0/orm/contextual.html

    Session Basics — SQLAlchemy 1.0 Documentation http://docs.sqlalchemy.org/en/rel_1_0/orm/session_basics.html
    rockivy
        19
    rockivy  
       2015-10-26 15:32:12 +08:00
    @shajiquan 收到, 今天做伸手党了, 非常感谢!
    shajiquan
        20
    shajiquan  
       2015-10-26 17:17:52 +08:00
    @rockivy 我只是转手一下,哈哈。一起加油!
    tuteng
        21
    tuteng  
       2015-10-29 18:54:56 +08:00
    今天用到了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   924 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 20:46 · PVG 04:46 · LAX 12:46 · JFK 15:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.