我有一个简单的问题在SQLAlchemy.我有一个模型在一个表,让我们叫它Model1在这里。我想添加一行,在这个表格,并得到autoincremented关键,因此我可以创建的另一种模式,并使用这种关键。这不是一个有缺陷的数据库设计(1:1的关系等)。我只需要这个关键在另一个表,因为其他表被转移到一个远程主机,并且我需要的配对钥匙所以服务器将互理解。不会有进一步地参考这些表2,并且它也不可能建立的关系,因为这一点。

考虑下列代码:

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"是不断增长,越来越多的模型。id主键。AnotherModel总是只有一小部分Model1,它没有处理。当然我可以添加一个标志在"Model1",布尔现场表中以标记已经处理的元素,但我希望这不会是必要的。

怎样才能让我上代码的工作?

欢迎,

汤姆

有帮助吗?

解决方案

几件事情:

  • 能否请你解释什么变 transaction 必?
  • 什么声明提出的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届会议和什么 flush() 不会,看 使用的会议.

基本上, flush() 导致待审的情况下成为持久,这意味着新的对象是插入到数据库的数据表。 flush() 还将更新的表格与价值观的实例,本届会议的轨道已改变。

commit() 总是问题 flush() 第一次。

在一个交易,你可以齐多次。每个flush()导致更新和/或插入的数据库。整个交易可以被犯或滚回来。

其他提示

如果要在没有提交任何内容的情况下生成新的主键标识符,只需调用session.flush()。这将在当前事务中发出数据库中待处理的所有内容。

我只使用了ForeignKeys,所以你在第二种情况下宁可做模型.AnotherModel(model1 = object1),然后就行了(tm)。所以我怀疑这可能是你的模特有问题,所以也许你也可以发布它们?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top