gpt4 book ai didi

python - SQLAlchemy:提交后对象映射丢失?

转载 作者:行者123 更新时间:2023-11-28 21:30:54 24 4
gpt4 key购买 nike

我在 SQLAlchemy 中遇到了一个简单的问题。我的表中有一个模型,我们将其称为 Model1。我想在这个表中添加一行,并获取自动增量键,这样我就可以用它创建另一个模型,并使用这个键。这不是一个有缺陷的数据库设计(1:1 关系等)。我只需要另一个表中的这个 key ,因为另一个表正在传输到远程主机,并且我需要匹配的 key ,以便服务器能够相互理解。这两个表之间不会有进一步的本地引用,因此也无法创建关系。

考虑以下代码:

object1 = model.Model1(param)
DBSession.add(object1)

# if I do this, the line below fails with an UnboundExecutionError.
# and if I dont do this, object1.id won't be set yet
#transaction.commit()

object2 = model.AnotherModel(object1.id) #id holds the primary, autoincremented key

我希望我什至不必“手动”提交。基本上我想要实现的是,“Model1”不断增长,并且 Model.id 主键不断增加。 AnotherModel 始终只是 Model1 的一小部分,尚未处理。当然,我可以在“Model1”中添加一个标志,这是表中的一个 bool 字段,用于标记已处理的元素,但我希望这不是必需的。

如何让上面的代码正常工作?

问候,

汤姆

最佳答案

有几件事:

  • 您能否解释一下变量 transaction 绑定(bind)了什么?
  • 到底什么语句会引发 UnboundExecutionError?
  • 请提供完整的异常消息,包括堆栈跟踪。
  • 在这种情况下,“正常”的做法是调用DBSession.flush()。你尝试过吗?

示例:

object1 = Model1(param)
DBSession.add(object1)
DBSession.flush()
assert object1.id != None # flushing the session populates the id

object2 = AnotherModel(object1.id)

有关 SA session 以及 flush() 功能的详细解释,请参阅 Using the Session .

基本上,flush() 会导致待处理实例变为持久性 - 这意味着新对象将插入到数据库表中。 flush() 还会使用 session 跟踪的发生更改的实例的值来更新表。

commit() 总是首先发出 flush()

在一个事务中,您可以多次刷新。每个flush()都会导致数据库中的更新和/或插入。整个事务可以提交或回滚。

关于python - SQLAlchemy:提交后对象映射丢失?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1033199/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com