使用SQLAlchemy查询SQLite数据库,需保留结果集中的重复节点
解决SQLAlchemy中多对多关联保留重复节点的问题
你当前的问题出在默认的secondary多对多关系上:SQLAlchemy会根据Node的主键去重,所以即使中间表ElementNode里有多个相同node_id的记录,返回的nodes列表里也只会保留唯一的Node对象。
要保留重复的节点条目,你需要调整关联结构,直接关联中间表ElementNode而不是Node,具体修改如下:
1. 修改中间表ElementNode的关联
给ElementNode添加与Node和Element的双向关联:
class ElementNode(Base): node_id = Column(Integer, ForeignKey('node.id_'), primary_key=True) element_id = Column(Integer, ForeignKey('element.id_'), primary_key=True) node_position = Column(Integer, primary_key=True) # 关联对应的Node对象 node = relationship('Node') # 关联对应的Element对象 element = relationship('Element', back_populates='element_nodes')
2. 调整Element类的关联定义
替换原来的nodes关联,改为关联ElementNode:
class Element(Base): id_ = Column(Integer, primary_key=True) # 关联所有对应的ElementNode记录,按node_position排序 element_nodes = relationship('ElementNode', back_populates='element', order_by='ElementNode.node_position') # 可选:添加一个属性,直接返回包含重复节点的列表 @property def nodes_with_duplicates(self): return [en.node for en in self.element_nodes]
使用方式
现在查询Element对象后:
- 调用
element.element_nodes可以获取所有中间表的记录,每个记录包含node_position和对应的Node对象 - 调用
element.nodes_with_duplicates可以直接得到按位置排序、包含重复节点的列表,比如对于element_id=100的实例,会返回[Node(1), Node(2), Node(3), Node(3), Node(3)]
这样就能完美保留中间表中所有的重复节点条目,同时保持按node_position的顺序。
内容的提问来源于stack exchange,提问作者Jeeenga
相关产品推荐
相关产品推荐

