SQLAlchemy:提交后的行为不一致

时间:2016-09-26 12:37:25

标签: python session orm sqlalchemy

我有一个SQLAlchemy ORM,其__str__()函数打印一个键和值表。 以下代码将其提交给DB并打印它(为清晰起见,属性名称已更改):

user.some_attribute = <Some integer>
session.add(user)
session.commit()
app.logger.debug("some_attribute is %s" % user.some_attribute)
app.logger.debug("Created a DB row:\n%s" % user)

这里疯狂的事情是第二个调试打印仅在第一个调试存在时才有效!

换句话说,如果存在两个调试行,我得到:

some_attribute is 5
+------------------------------------------+-------------------------------------------------+
| Field                                    | Value                                           |
+------------------------------------------+-------------------------------------------------+
| creation_time                            | 2016-09-26 15:25:45.630230                      |
| description                              | Test Poly 835                                   |
| destination_truck_ids                    | ['A']                                             |
| future_event_series_id                   | None                                            |
| id                                       | 1017                                            |
...

但如果只有第二个存在,我得到:

+-------+-------+
| Field | Value |
+-------+-------+
+-------+-------+

为什么ORM没有属性,除非打印出其中一个功能?

1 个答案:

答案 0 :(得分:0)

我发现了一种解决方法,即使我不确定问题的性质。

引用the manual

  

默认情况下,Session也会使所有数据库加载状态到期   事务提交后的ORM管理的属性。这样就可以了   后续操作从数据库加载最新数据。   可以使用expire_on_commit = False选项禁用此行为   到sessionmaker或Session构造函数。

如果我使用expire_on_commit=False加载会话,问题就解决了 - 即使在提交后我也会收到ORM。