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

2015-10-26 10:09:08 +08:00
 larkifly
例如:
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()
这样执行两次就可以了。


问题就是,如何实现类似于上面的那个效果
8778 次点击
所在节点    Python
21 条回复
rockivy
2015-10-26 10:25:50 +08:00
关注

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

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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/231075

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX