【发布时间】:2013-06-14 19:53:57
【问题描述】:
我目前正在尝试使用声明性方法创建 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() 构造函数以防止对象被添加到会话中?
【问题讨论】:
-
我刚刚注意到很多人都在问相反的问题(如何自动添加到会话中),所以我猜我的 tmp 对象以某种方式与持久对象相关联,因此自动包含在会议。
-
本,我也注意到了同样的事情。每当我定义了关系并且我执行了这样的操作 -> user.address.append(Address(...)) 时,附加的地址就会自动添加到我的会话中。这实际上是一个不错的捷径,除了你的情况:-)
-
创建对象不会导致它们与您的会话相关联。你一定在做其他让他们坚持的事情;可能与 jaime 的例子类似。您需要向我们展示更多重现您的问题的代码,然后我们才能帮助您找到避免问题的便捷方法。
-
@TokenMacGuy 和 jaime:谢谢,我终于找到了解决问题的方法,这确实是某个地方的托管对象的链接。我已经发布了答案,以防万一有人遇到同样的问题。
标签: python sqlalchemy