5

我有这样的 sqlalchemy 关系(为简单起见进行了修剪):

class Parent(Base):
  __tablename__ = 'Parent'
  name = Column(String, nullable=False)
  def __init__(self, name)
    self.name = name

class Child(Base):
  __tablename__ = 'Child'
    name = Column(String, nullable=False)
    parent = relationship(Parent, backref=backref('children')
  def __init__(self, name, parent)
    self.name = name
    self.parent = parent

在我的对象工作时:

parent = Parent("my parent")
db_session.add(parent) # must be done for other reasons not relevant to the issue.
child = Child("my child", parent)

到目前为止,一切都很好。但是在提交之前,当我执行以下操作时,我会获得数据库刷新:

children = parent.children # using the backref causes a flush

可以通过更改我定义反向引用/关系的方式来避免这种情况吗?

4

2 回答 2

4

使用 Session.no_autoflush 上下文管理器应该以安全的方式实现您想要的:

with session.no_autoflush:    
    parent = Parent("my parent")
    db_session.add(parent) 
    child = Child("my child", parent)
于 2013-11-08T17:21:18.240 回答
0

我不是 SQLAlchemy 专家,但看起来 SQLAlchemyparent.children在刷新父项和子项之前无法安全地填充集合,因为在这种情况发生之前,用于它们的关系的主键和外键是未定义的。也许它甚至需要查询,因为它无法事先知道关系所需的所有对象是否都在当前会话中。

我没有看到任何解决方案,坦率地说,我不认为这是一个问题。您的案例闻起来很像过早的优化。

session.autoflush = False无论如何,我想您可以通过设置并True在离开这一点后返回来禁用会话中的自动刷新。也许它有效,但你可能会遇到意想不到的情况。

于 2013-11-07T21:22:25.223 回答