炼金术中的关系

2024-10-03 02:32:12 发布

您现在位置:Python中文网/ 问答频道 /正文

SQL Alchemy可以很好地处理邻接结构,例如自引用表节点其中外键node.parent\u id与主键相关节点id。你知道吗

我有一个不太传统的模型,其中一个节点有两个父节点(系谱数据库)。在这种情况下,节点材料id节点.pat\u id分别与父节点和母节点相关。SQL炼金术也可以:

mother = db.relationship("Node", 
    foreign_keys = "Node.mat_id", remote_side="Node.id")
father = db.relationship("Node", 
    foreign_keys = "Node.pat_id", remote_side="Node.id")

(使用声明性的)。你知道吗

所以得到一个节点的双亲是很简单的。我的问题是如何使用此设置获取节点的子节点。我找不到一种方法来建立一种相当于:

offspring = db.relationship("Node", 
    foreign_keys = "Node.mat_id | Node.pat_id")

我所能做到的最好的方法是分别声明mat\u foundary和pat\u foundary关系,并创建一个返回相应关系的成员函数foundary()。它工作,但似乎不雅。有更好更传统的方法吗?你知道吗


Tags: 方法idnodedbsql节点remote传统
1条回答
网友
1楼 · 发布于 2024-10-03 02:32:12

考虑到原始模式的限制,您走上了正确的道路。将连接条件作为^{}传递,而不是foreign_keys

class Node(Base):
    __tablename__ = "node"

    id = Column(Integer, primary_key=True)
    mat_id = Column(ForeignKey(id))
    pat_id = Column(ForeignKey(id))

    mother = relationship("Node", foreign_keys=[mat_id], remote_side=id)
    father = relationship("Node", foreign_keys=[pat_id], remote_side=id)
    offspring = relationship("Node",
        primaryjoin=or_(id == mat_id, id == pat_id),
        viewonly=True)

注意,由于连接条件更复杂,关系定义为view only。换句话说,您不能简单地通过它向节点添加子节点,因为您不能说父节点是新添加子节点的父节点还是母节点。从这个意义上说,你原来独立的母系和父系关系是优越的。你知道吗

相关问题 更多 >