我有一个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没有属性,除非打印出其中一个功能?
答案 0 :(得分:0)
我发现了一种解决方法,即使我不确定问题的性质。
引用the manual:
默认情况下,Session也会使所有数据库加载状态到期 事务提交后的ORM管理的属性。这样就可以了 后续操作从数据库加载最新数据。 可以使用expire_on_commit = False选项禁用此行为 到sessionmaker或Session构造函数。
如果我使用expire_on_commit=False
加载会话,问题就解决了 - 即使在提交后我也会收到ORM。