首页 > 解决方案 > 如何防止包含重复项的 SQLAlchemy 集合

问题描述

这个问题涉及 python 集合中包含的值,而不是数据库本身。

如果我有一个标准的递归多对一关系:

class Person(Base):
    __tablename__ = 'person'
    children = relationship(
        "Person",
        cascade="all, delete-orphan",
        backref=backref("parent", remote_side="Person.id"),
    )

并创建一个父母和孩子,然后将孩子重新添加到父母,我得到意想不到的行为:

>>> parent = Person()
>>> child = Person(parent=parent)
>>> session.add(parent, child)
>>> session.flush()
>>> child.parent = parent
>>> parent.children.append(child)
>>> len(parent.children)
2  # expected 1
>>> child.parent = None
>>> len(parent.children)
1  # expected 0

实现预期行为的最佳方法是append什么,因为对象已经在集合中,所以什么都不做?因为关系是递归的,我真的不想急切加载孩子,所以如果解决方案在children关系没有加载时表现良好,那将是一个很大的优势 - 这就是为什么我不热衷于简单地做

if child not in parent.children:
    parent.children.append(child)

但也许这一切,以及随之而来的额外负荷,真的是可能的吗?

标签: pythonsqlalchemy

解决方案


推荐阅读