Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 炼金术中的关系_Python_Sqlalchemy_Relational - Fatal编程技术网

Python 炼金术中的关系

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

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.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)