1
halmstad 2017-01-21 07:53:31 +08:00 via iPhone 1
首先,并没有提交到数据库,只 flush 了, flush 和 commit 不是一件事情。其次 session 创建的时候有个 auto_flush 参数表明 query 的时候是否 flush ,默认是 True, 多看看文档,才能更好的使用
|
2
panyanyany 2017-01-21 08:03:17 +08:00
在 SQLAlchemy 中, add() 操作之后数据成为 pending 状态,此时数据不会立即写入到数据库中。
当你执行 query() 的时候,它会先把之前状态为 pending 的数据写入到数据库,并且更新当前 session 中存储的数据,然后再执行 query() 你可以看下文档的这个小节: [Adding and Updating Objects]( http://docs.sqlalchemy.org/en/rel_1_1/orm/tutorial.html#adding-and-updating-objects) |
3
jjx 2017-01-21 08:11:40 +08:00
处理是合理的,只是不太智能,对同一个对象会生成多条更新语句.性能敏感时建议直接用 sql expression
|
4
rogwan 2017-01-21 08:26:36 +08:00
和 return 返回自动提交类似,也算是一种防止用户忘记 commit 的做法吧。
默认主动帮用户提交、默认不主动帮用户提交,两个方案肯定是选前者。 |
5
eyp82 OP @halmstad 是没有 commit, 毕竟后面还可以 rollback. 我的意思是确实执行了写操作, 否则那个 auto_increment 的 id 是拿不到的(这个必须数据库生成并返回, ORM 不能自作主张生成一个) 而这个放在 query 里做, 感觉不如放到前面 add 里.
|
7
skydiver 2017-01-21 13:28:29 +08:00 via Android
正常行为,要不然你后面需要用这个 id 怎么办
|
8
sleshep 2017-01-22 17:51:57 +08:00
一般中间 query 的时候都会手动 flush,这是常识
|