SQLAlchemy对象与数据库同步的混淆
我正在学习SQLAlchemy ORM教程(),我发现很难理解Python对象何时/为什么会反映数据库中的最新数据 下面是一系列让我困惑的事件:SQLAlchemy对象与数据库同步的混淆,sqlalchemy,Sqlalchemy,我正在学习SQLAlchemy ORM教程(),我发现很难理解Python对象何时/为什么会反映数据库中的最新数据 下面是一系列让我困惑的事件: 首先,我们创建一个用户ed\u user,并将其添加到会话中。其id为None,因为该行尚未写入数据库 然后我们创建一个不同的用户我们的用户,该用户是通过使用匹配ed\u用户的查询查询数据库获得的。所以我们的用户和ed\u用户实际上是同一个用户。在执行此查询后,当我们查询our_user.id或ed_user.id时,我们看到id现在已被分配,因为编
- 首先,我们创建一个用户
,并将其添加到会话中。其ed\u user
为id
,因为该行尚未写入数据库None
- 然后我们创建一个不同的用户
,该用户是通过使用匹配我们的用户
的查询查询数据库获得的。所以ed\u用户
和我们的用户
实际上是同一个用户。在执行此查询后,当我们查询ed\u用户
或our_user.id
时,我们看到ed_user.id
现在已被分配,因为编写SELECT查询时,id
已刷新到数据库中ed_user
- 然后我们编辑
,添加一些其他不相关的行,并发出会话提交ed_user
- 最后,我们再次读取
的值,它会导致数据库发出SELECT查询,以获取自上次提交结束上次事务以来id的最新值ed_user.id
ed_user
写入数据库之前,SQLAlchemy满足于为id
提供一个None
值,即使它可以获得一个id,如果它继续并刷新对数据库的写入,但出于某种原因,一旦行写入数据库一次,SQLAlchemy认为保持它的最新状态(在最后一步中)很重要通过在读取数据时刷新数据。为什么会发生这种情况?是什么控制了这种行为
总之,关于何时/为什么/如何使我的Python对象与数据库保持最新,我不知道我可以依靠什么逻辑,如果您能提供任何额外的清晰性,我将不胜感激。我将通过您的要点,尝试对SQL中的炼金术进行一些说明
- 首先,我们创建一个用户
,并将其添加到会话中。其ed\u user
为id
,因为该行尚未写入数据库None
- 然后我们创建一个不同的用户
,该用户是通过使用匹配我们的用户
的查询查询数据库获得的。所以ed\u用户
和我们的用户
实际上是同一个用户ed\u用户
我们的用户
,这有点误导。而是执行查询并将结果绑定到名称我们的用户
:
在这里,重要的是要记住,所有挂起的更改都会在该查询发生之前刷新。这意味着绑定到名称ed_user
的对象中保存的更改被发送到数据库,SQLAlchemy获取其数据库标识(id
不再是None
),将其移动到持久状态并将其添加到数据库中
由于所有这些都是在查询之前发生的,因此您会得到在刷新Ed对象时创建的行作为结果,并且检查该行的标识(使用标识映射)SQLAlchemy会注意到,它实际上表示会话中持有的现有对象,即之前绑定到名称Ed_user
的对象。这就是为什么ed_user.id
和our_user.id
都给了您相同的值——事实上ed_用户是我们的_用户
也将是真的
;它们是同一个物体
- 最后,我们再次读取
的值,它会导致数据库发出ed_user.id
查询,以获取自上次提交结束上次事务以来SELECT
的最新值id
>>> our_user = session.query(User).filter_by(name='ed').first()