【问题标题】:Creating SQLAlchemy object outside of session在会话之外创建 SQLAlchemy 对象
【发布时间】: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


【解决方案1】:

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

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

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

mytmpobject.relationobject =  aManagedRelationObject

这样做:

mytmpobject.relationobject_id = aManagedRelationObject.id

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

【讨论】:

  • 另一个解决方案是使用 session.expunge_all() 删除所有内容,然后仅重新添加我想要保留的部分。
  • @Bem G - 如何在没有 SQLAlchemy 对你大喊大叫的情况下获得 realtionobject_id?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-26
  • 1970-01-01
  • 2012-08-26
  • 1970-01-01
  • 2020-08-06
  • 1970-01-01
相关资源
最近更新 更多