Note that there are some explanatory texts on larger screens.

plurals
  1. PODirected Graph - SQLAlchemy ORM
    text
    copied!<p>I am trying to create a directed graph (with backward references) via SQLAlchemy; how can I get the desired output listed below? [<em>see section titled 'Desired Output'</em>]</p> <hr> <h1>Example code:</h1> <h2>example_db.py</h2> <pre class="lang-python prettyprint-override"><code>from sqlalchemy import Column, Integer, ForeignKey, Table from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import relationship, backref Base = declarative_base() node_connector = Table('node_connector', Base.metadata, Column('from_node_handle', Integer, ForeignKey('node.handle')), Column('to_node_handle', Integer, ForeignKey('node.handle'))) class Node(Base): __tablename__ = 'node' handle = Column(Integer, nullable=False, primary_key=True) next_nodes = relationship('Node', secondary=node_connector, foreign_keys=[node_connector.c.to_node_handle], backref=backref("previous_nodes", foreign_keys=[node_connector.c.from_node_handle])) </code></pre> <h2>test/example_db_test.py</h2> <p><em><strong>Module being executed</em></strong></p> <pre class="lang-python prettyprint-override"><code>from sqlalchemy import create_engine, event from sqlalchemy.engine import Engine from sqlalchemy.orm import sessionmaker import unittest from ..example_db import Base, Node class TestNodeDB(unittest.TestCase): def setUp(self): engine = create_engine('sqlite:///:memory:', echo=False) SessionMaker = sessionmaker(bind=engine) self.__session = SessionMaker() Base.metadata.create_all(engine) def test_node_creation(self): node_a = Node() node_b = Node() node_c = Node() self.__session.add(node_a) self.__session.add(node_b) self.__session.add(node_c) node_a.next_nodes.append(node_b) node_b.next_nodes.append(node_c) self.__session.commit() nodes = self.__session.query(Node) for node in nodes: print "Node handle " + str(node.handle) + ":" for next_node in node.next_nodes: print "\t next node handle " + str(next_node.handle) for previous_node in node.previous_nodes: print "\t previous node handle " + str(previous_node.handle) if __name__ == "__main__": unittest.main() </code></pre> <h1>Output</h1> <h2>Actual output</h2> <pre><code>Node handle 1: Node handle 2: next node handle 2 previous node handle 2 Node handle 3: next node handle 3 previous node handle 3 </code></pre> <h2>Desired Output</h2> <pre><code>Node handle 1: next node handle 2 Node handle 2: next node handle 3 previous node handle 1 Node handle 3: previous node handle 2 </code></pre> <hr> <p>How can I get this desired output?</p> <p>Thanks!</p>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload