1

我目前正在尝试使用声明性方法创建 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() 构造函数以防止将对象添加到会话中?

4

1 回答 1

1

好的,确实,我将这些 tmp 对象添加到托管对象中,从而使它们也由会话管理。

解决方案是停止使用关系将 tmp 对象链接到托管对象,并改用外键列(我仍然需要保留信息)。

因此,不要这样做(在这种情况下,使用反向引用关系):

mytmpobject.relationobject =  aManagedRelationObject

做这个 :

mytmpobject.relationobject_id = aManagedRelationObject.id

这样,mytmpobject 就留在了会话之外。

于 2013-06-14T21:55:06.533 回答