我目前正在尝试使用声明式方法创建sqlalchemy对象,这些方法是“临时”对象,并不是要保留,而是简单地进行比较。
因此,我想在当前会话“之外”创建它们。问题是如果我没有逐个删除它们,会话会尝试刷新它们,从而产生外键错误(这是正常的,因为对象不完整)。
我一直在使用sqlalchemy.ext.declarative中的“declarative_base”来创建一个基类,然后从它继承来创建我的模型对象。 例如(伪代码):
class BaseEntity(object):
... common columns ...
Base = declarative_base(cls=BaseEntity)
class MyObject(Base):
... other columns ..
现在每当我这样做:
tmpobj = MyObject()
我需要这样做(会话对象是另一个模块中声明的scoped_session)
session.expunge(tmpobj)
,考虑到创建tmp对象(并且彼此嵌套)的复杂方式,实际上是非常有用的。
我是否可以传递给MyObject()构造函数以防止将对象添加到会话中?
答案 0 :(得分:1)
好的,确实,我正在将这些tmp对象添加到托管对象,从而使它们也可以通过会话进行管理。
解决方案是停止使用关系将tmp对象链接到托管对象,而是使用外键列(我仍然需要保留信息)。
所以,不要这样做(在这种情况下,使用backref关系):
mytmpobject.relationobject = aManagedRelationObject
这样做:
mytmpobject.relationobject_id = aManagedRelationObject.id
这样,mytmpobject就会停留在会话之外。