SQLAlchemy:对象映射失去了之后提交?
-
06-07-2019 - |
题
我有一个简单的问题在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)。所以我怀疑这可能是你的模特有问题,所以也许你也可以发布它们?