python - 如何防止包含重复项的 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)
但也许这一切,以及随之而来的额外负荷,真的是可能的吗?
解决方案
推荐阅读
- firebase - Firebase:如何防止在 Firestore 中写入特定字段?
- list - 使用哪个函数在 kotlin 中制作列表的副本
- android - 如何使用复选框来确定显示或跳过入职屏幕?
- java - Eclipse 在多个项目上运行不同的 Maven 目标
- git - 包含斜杠的分支名称的 Stash GIT API 是什么?
- c# - Cefsharp 不显示图像
- logparser - ORDER BY 不同方向的多列(ASC 和 DESC)
- containers - 服务容器未使用环境变量进行更新
- powerbi - 基于power bi中另一个表的过滤矩阵
- ajax - laravel modal 显示客户端信息