I had specified the foriegnkeys for previous/next_sibling to node_table.c.id, but it appeared to make no difference, so I removed them in case is was casing a problem.
Setting these relations to your suggestion still fires the same error. Michael Bayer wrote: > your relationships are not being set up correctly, since you haven't > specified a "foreignkey" parameter on any of them. note that the > "root" relationship in the documentation example has a "foreignkey" > set on it. > > when you say: > >> node_table.c.parent_id==node_table.c.id > > the "foreignkey" is automatically going to be "parent_id". but for > half of those relationships, you want the "foreignkey" to be "id". > the actual ordering of the columns in the comparison is not significant. > > > On Sep 5, 2006, at 10:12 AM, Nick Joyce wrote: > >> I am attempting to extend the self referential example in the docs >> http://www.sqlalchemy.org/docs/index.myt? >> paged=no#advdatamapping_circular >> by adding properties 'prev_sibling' and 'next_sibling'. (See attached >> script) >> >> When run, the following exception is raised: >> >> Traceback (most recent call last): >> File "tree.py", line 79, in ? >> session.flush() >> File "build/bdist.linux-i686/egg/sqlalchemy/orm/session.py", line >> 234, >> in flush >> File "build/bdist.linux-i686/egg/sqlalchemy/orm/unitofwork.py", line >> 197, in flush >> File "build/bdist.linux-i686/egg/sqlalchemy/orm/unitofwork.py", line >> 359, in execute >> File "build/bdist.linux-i686/egg/sqlalchemy/orm/unitofwork.py", line >> 407, in _sort_dependencies >> File "build/bdist.linux-i686/egg/sqlalchemy/orm/unitofwork.py", line >> 395, in sort_hier >> File "build/bdist.linux-i686/egg/sqlalchemy/orm/unitofwork.py", line >> 800, in _sort_circular_dependencies >> File "build/bdist.linux-i686/egg/sqlalchemy/orm/topological.py", >> line >> 139, in sort >> sqlalchemy.exceptions.FlushError: Circular dependency detected >> {<Node(path=first)> (idself=1079711436): {<Node(path=second)> >> (idself=1079711468): True, <Node(path=root)> (idself=1079711404): >> True}, <Node(path=root)> (idself=1079711404): {<Node(path=second)> >> (idself=1079711468): True, <Node(path=first)> (idself=1079711436): >> True}, <Node(path=second)> (idself=1079711468): {<Node(path=first)> >> (idself=1079711436): True, <Node(path=root)> (idself=1079711404): >> True}}[] >> >> I am doing something wrong? If so can someone point me in the right >> direction ... >> >> Thanks, >> >> Nick >> import sqlalchemy.mods.threadlocal >> from sqlalchemy import * >> >> engine = create_engine('sqlite:///:memory:', echo=True); >> metadata = BoundMetaData(engine) >> >> node_table = Table('node', metadata, >> Column('id', Integer, primary_key=True), >> Column('path', String(50), nullable=False), >> Column('parent_id', Integer, ForeignKey('node.id'), >> nullable=True), >> Column('prev_sibling_id', Integer, ForeignKey('node.id'), >> nullable=True), >> Column('next_sibling_id', Integer, ForeignKey('node.id'), >> nullable=True) >> ) >> >> class Node(object): >> def __init__(self, path=''): >> self.path = path >> >> def has_child_nodes(self): >> return len(self.children) == 0 >> >> def append_child(self, child): >> try: >> lc = self.children[len(self.children) - 1] >> except IndexError, e: >> lc = None >> >> self.children.append(child) >> >> child.parent = self >> >> if lc is not None: >> lc.next_sibling = child >> child.previous_sibling = lc >> >> def __repr__(self): >> return '<Node(path=%s)>' % self.path >> >> n_mapper = mapper(Node, node_table, properties={ >> 'parent': relation( >> Node, >> lazy=True, >> primaryjoin=node_table.c.parent_id==node_table.c.id, >> uselist=False >> ), >> 'children': relation( >> Node, >> primaryjoin=node_table.c.id==node_table.c.parent_id, >> lazy=True, >> cascade="all, delete-orphan" >> ), >> 'previous_sibling': relation( >> Node, >> primaryjoin=node_table.c.prev_sibling_id==node_table.c.id, >> lazy=True, >> uselist=False >> ), >> 'next_sibling': relation( >> Node, >> primaryjoin=node_table.c.next_sibling_id==node_table.c.id, >> lazy=True, >> uselist=False >> ) >> }) >> >> if __name__ == '__main__': >> node_table.create() >> >> root = Node('root') >> first = Node('first') >> second = Node('second') >> >> root.append_child(first) >> root.append_child(second) >> >> print first==second.previous_sibling >> >> session = objectstore.session >> >> session.flush() >> ---------------------------------------------------------------------- >> --- >> Using Tomcat but need to do more? Need to support web services, >> security? >> Get stuff done quickly with pre-integrated technology to make your >> job easier >> Download IBM WebSphere Application Server v.1.0.1 based on Apache >> Geronimo >> http://sel.as-us.falkag.net/sel? >> cmd=lnk&kid=120709&bid=263057&dat=121642______________________________ >> _________________ >> Sqlalchemy-users mailing list >> Sqlalchemy-users@lists.sourceforge.net >> https://lists.sourceforge.net/lists/listinfo/sqlalchemy-users > > > ------------------------------------------------------------------------- > Using Tomcat but need to do more? Need to support web services, security? > Get stuff done quickly with pre-integrated technology to make your job easier > Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo > http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642 ------------------------------------------------------------------------- Using Tomcat but need to do more? Need to support web services, security? Get stuff done quickly with pre-integrated technology to make your job easier Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642 _______________________________________________ Sqlalchemy-users mailing list Sqlalchemy-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/sqlalchemy-users