I have a table that defines a self-referential hierarchy. My problem
is figuring out how to specify that relationship in declarative
syntax. From reading the documentation and looking at example
basic_tree.py, I think I understand it when using tables and mappers,
but can't get it right with declarative.

Here is one way I tried it. Using 0.5rc2 or 0.5rc3 gives the traceback
below on session.commit() telling me I have circular references.

import sqlalchemy
print 'SQLAlchemy version', sqlalchemy.__version__

from sqlalchemy import create_engine, Column, Integer, String,
MetaData, ForeignKey
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, relation, backref

engine = create_engine(r'sqlite:///:memory:')
Base = declarative_base(bind=engine)
class People(Base):
    __tablename__ = 'people'
    id = Column(Integer, primary_key=True)
    parent_id = Column(Integer, ForeignKey('people.id'))
    name = Column(String)
    parent = relation('People', cascade='all',
backref=backref('children'))

Base.metadata.create_all()
Session = sessionmaker()
session = Session()

p1 = People(name='john')
p2 = People(name='susie')
p3 = People(name='joannie')
p1.children.append(p2)
p2.children.append(p3)
session = Session()
session.add(p1)
session.commit()

  File "sample_recursive.py", line 30, in <module>
    session.commit()
  File "C:\Python25\lib\site-packages\sqlalchemy-0.5.0rc2-py2.5.egg
\sqlalchemy\orm\session.py", line 670, in commit
    self.transaction.commit()
  File "C:\Python25\lib\site-packages\sqlalchemy-0.5.0rc2-py2.5.egg
\sqlalchemy\orm\session.py", line 375, in commit
    self._prepare_impl()
  File "C:\Python25\lib\site-packages\sqlalchemy-0.5.0rc2-py2.5.egg
\sqlalchemy\orm\session.py", line 359, in _prepare_impl
    self.session.flush()
  File "C:\Python25\lib\site-packages\sqlalchemy-0.5.0rc2-py2.5.egg
\sqlalchemy\orm\session.py", line 1361, in flush
    self._flush(objects)
  File "C:\Python25\lib\site-packages\sqlalchemy-0.5.0rc2-py2.5.egg
\sqlalchemy\orm\session.py", line 1431, in _flush
    flush_context.execute()
  File "C:\Python25\lib\site-packages\sqlalchemy-0.5.0rc2-py2.5.egg
\sqlalchemy\orm\unitofwork.py", line 261, in execute
    tasks = self._sort_dependencies()
  File "C:\Python25\lib\site-packages\sqlalchemy-0.5.0rc2-py2.5.egg
\sqlalchemy\orm\unitofwork.py", line 302, in _sort_depen
dencies
    for t in task._sort_circular_dependencies(self,
[self.get_task_by_mapper(i) for i in cycles]):
  File "C:\Python25\lib\site-packages\sqlalchemy-0.5.0rc2-py2.5.egg
\sqlalchemy\orm\unitofwork.py", line 568, in _sort_circu
lar_dependencies
    head = topological.sort_as_tree(tuples,
object_to_original_task.keys())
  File "C:\Python25\lib\site-packages\sqlalchemy-0.5.0rc2-py2.5.egg
\sqlalchemy\topological.py", line 58, in sort_as_tree
    return _organize_as_tree(_sort(tuples, allitems,
allow_cycles=with_cycles))
  File "C:\Python25\lib\site-packages\sqlalchemy-0.5.0rc2-py2.5.egg
\sqlalchemy\topological.py", line 212, in _sort
    raise CircularDependencyError("Circular dependency detected " +
repr(edges) + repr(queue))
sqlalchemy.exc.CircularDependencyError: Circular dependency detected
[(<sqlalchemy.orm.identity.IdentityManagedState object
 at 0x00E80510>, <sqlalchemy.orm.identity.IdentityManagedState object
at 0x00E80490>), (<sqlalchemy.orm.identity.IdentityMa
nagedState object at 0x00E80490>,
<sqlalchemy.orm.identity.IdentityManagedState object at 0x00E80510>),
(<sqlalchemy.orm.id
entity.IdentityManagedState object at 0x00E80490>,
<sqlalchemy.orm.identity.IdentityManagedState object at 0x00E80C70>),
(<
sqlalchemy.orm.identity.IdentityManagedState object at 0x00E80C70>,
<sqlalchemy.orm.identity.IdentityManagedState object at
 0x00E80490>)][]

--
Mike Conley

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to