Python 炼金术中的关系
SQL Alchemy可以很好地处理邻接结构,例如一个自引用表节点,其中外键节点。父\u id与主键节点.id相关 我有一个不太传统的模型,其中一个节点有两个父节点(系谱数据库)。其中,节点.mat_id和节点.pat_id分别与母系和父系父节点相关。SQL Alchemy也可以:Python 炼金术中的关系,python,sqlalchemy,relational,Python,Sqlalchemy,Relational,SQL Alchemy可以很好地处理邻接结构,例如一个自引用表节点,其中外键节点。父\u id与主键节点.id相关 我有一个不太传统的模型,其中一个节点有两个父节点(系谱数据库)。其中,节点.mat_id和节点.pat_id分别与母系和父系父节点相关。SQL Alchemy也可以: mother = db.relationship("Node", foreign_keys = "Node.mat_id", remote_side="Node.id") father = db.relat
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_foundant和pat_foundant关系,并创建一个返回相应关系的成员函数foundant()。这很管用,但似乎不雅观。有更好、更传统的方法吗?考虑到原始模式的局限性,您走上了正确的道路。您将传递连接条件,而不是
外键
:
请注意,由于连接条件更复杂,关系定义为。换句话说,您不能简单地通过它向节点添加子节点,因为您不能说父节点是新添加子节点的父节点还是母节点。从这个意义上说,你原来的母系和父系分开的关系是优越的。我可以建议改变模式吗。为什么您需要分别使用mat_\u id和pat_\u id?您可以使用两列:ID和sex_标志(布尔值)。这将解决您的问题,因为您现在有1列要引用。这是否适合您的情况?这是其他软件使用的预先存在的模式,因此更改它不太可能是可行的,至少在短期内是如此。你能把你的建议再详细一点吗?我想我明白你的意思了:一个额外的连接表,每个孩子有两行(parentid/childid)?是的,我想这应该行得通,如果我从这里开始的话,这可能是一个更好的设计。考虑到现有的模式,我更喜欢一个解决方案,但谢谢你的建议-我会投票,但我是新来的,所以我似乎还没有权限这么做。谢谢,我会看一看。这个项目只是第一次了解Python和SQLAlchemy的借口,几年前就被放弃了。正如你从另一个问题中所知道的,虽然我现在已经开始在另一个项目中再次研究它,所以该技术可能仍然是有用的。
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)