SqlAlchemy加入图形结构

时间:2018-02-07 18:59:00

标签: python postgresql sqlalchemy

我正在使用下面的ORM创建图形结构,并且能够进行插入。

Base = declarative_base()

class Link(Base):

    __tablename__ = 'base_link'
    _constraints = ['first_id', 'second_id']
    __table_args__ = (UniqueConstraint(*_constraints, name = 'link_constraint'), {"schema":"my_schema"})
    id = Column(CHAR(32), primary_key=True)
    object_type = Column(String(16))
    first_id = Column(CHAR(32), ForeignKey(Node.id))
    second_id = Column(CHAR(32), ForeignKey(Node.id))
    orl1 =relationship('Node', foreign_keys=first_id)
    orl2 =relationship('Node', foreign_keys=second_id)

class Node(Base):

    __tablename__ = 'node'
    _constraints = ['h_name', 'd_name']
    __table_args__ = (UniqueConstraint(*_constraints, name='node_constraint'), {"schema":"my_schema"})
    h_name = Column(String(256),nullable=False)
    d_name = Column(String(256),nullable=True)
    id = Column(CHAR(32),primary_key=True)

我很难查询上面的对象 例如:

Case-1

Case-2

案例1 对于Case-1(ref case-1.png),我的加入非常简单。

  Usage = aliased(Link, name = "Usage")
  node_1 = aliased(Node, name = "node_1")
  node_2 = aliased(Node, name = "node_2")

查询将是

session.query(node_1, node_2).join(Usage, node_1.id == Usage.first_id).join(node_2, node_2.id == Usage.second_id)

我的案例2(ref case-2.png)如何加入?

  Usage = aliased(Link, name = "Usage")
  Usage_2 = aliased(Link, name = "Usage_2")
  node_1 = aliased(Node, name = "node_1")
  node_2 = aliased(Node, name = "node_2")
  node_3 = aliased(Node, name = "node_3")

我无法正确构建查询

下面的查询尽可能接近

session.query(node_1, node_2, node_3).join(Usage, node_1.id==Usage.first_id).join(Usage_2, node_3.id==Usage_2.first_id).join(node_2, and_(node_2.id==Usage.second_id,  node_2.id==Usage_2.second_id))
我知道这是错的。如果有人能指出我的案例2加入的正确方向,那将是非常好的。

谢谢。

1 个答案:

答案 0 :(得分:0)

我在sqlalchemy小组中发布了同样的问题,并对如何解决我的问题有了一些了解,请点击下面的链接。 https://groups.google.com/forum/#!topic/sqlalchemy/L9u3LuJp-AY