need a full test case.  Here's yours, runs fine:

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import *
from sqlalchemy.types import *
from sqlalchemy.orm import *

Base = declarative_base()
e = create_engine('sqlite://', echo=True)
Base.metadata.bind = e

sess = sessionmaker(e)()

class School(Base):
    __tablename__ = 'scuola_scuola'

    cod = Column(String(10), primary_key=True)
    denominazione= Column(String(120))
    cod_riferimento = Column(String(10), ForeignKey(cod))
    cliente         = Column(Boolean, nullable=False)

    sedi = relation('School', )

    def __repr__(self):
        return self.cod

Base.metadata.create_all()

s1 = School(cod="S1", cod_riferimento="S1", cliente=False)
d1 = School(cod="D1", cod_riferimento="S1", cliente=False)
sess.add(s1)
sess.add(d1)
sess.commit()
s1 = sess.query(School).get('S1')
d1 = sess.query(School).get('D1')
d1.cliente = False
sess.commit()


On Aug 26, 2010, at 12:12 PM, Alessandro Dentella wrote:

> Hi again, sorry for flooding with email this week...
> 
> I stumbled on the CircularDependencyError in some occasions with self
> referencing models. I do understand that it can be tricky to INSERT and DELETE
> but I'm just updating rows.
> 
> I reduced my problem to the bare minimum. It works both on 0.5.8 and 0.6.3
> in the test case, but as long as I use the same objects from a graphical GUI
> I get an error, Debugging with pdb, the problem arises on session.begin()
> and in that moment the situation seems to me exactly the one of the test (2
> objects, one modified).
> 
> I hope the error message is meaningful to you...
> 
> So the situation:
> 
>   from sqlalchemy.ext.declarative import declarative_base
>   from sqlalchemy import Table, Column, ForeignKey
>   from sqlalchemy.types import *
>   from sqlalchemy import orm, sql
> 
>   Base = declarative_base()
>   URL = 'postgresql://localhost/scuole'
>   Base.metadata.bind = URL
>   Session = orm.sessionmaker()
>   sess = Session(bind=Base.metadata.bind, expire_on_commit=False, 
> autoflush=False, autocommit=True, ) 
> 
>   class School(Base):
>       __tablename__ = 'scuola_scuola'
> 
>       cod = Column(String(10), primary_key=True)
>       denominazione= Column(String(120))
>       cod_riferimento = Column(String(10), ForeignKey(cod))
>       cliente         = Column(Boolean, nullable=False)
> 
>       sedi = orm.relation('School', )
> 
>       def __repr__(self):
>           return self.cod
> 
>   Base.metadata.create_all()
> 
>   # s1 = School(cod="S1", cod_riferimento="S1", cliente=False)
>   # d1 = School(cod="D1", cod_riferimento="S1", cliente=False)
>   # sess.add(s1)
>   # sess.add(d1)
>   # sess.commit()
>   s1 = sess.query(School).get('S1')
>   d1 = sess.query(School).get('D1')
>   d1.cliente = False
>   sess.begin()
>   sess.commit()
> 
> This same peace of code (i.e.: same session with just s1, d1), run from
> within a GUI raises an error (only with SA 0.6.3, 0.5.8 just works). The
> error is:
> 
> 
> 
> Traceback (most recent call last):
>  File "/misc/src/hg/py/sqlkit/sqlkit/widgets/mask/mask.py", line 388, in 
> record_save_cb
>    self.record_save(None)
>  File "/misc/src/hg/py/sqlkit/sqlkit/widgets/mask/mask.py", line 422, in 
> record_save
>    self.commit()
>  File "/misc/src/hg/py/sqlkit/sqlkit/widgets/common/sqlwidget.py", line 972, 
> in commit
>    self.session.begin()
>  File "/misc/src/sqlalchemy/sqlalchemy/lib/sqlalchemy/orm/session.py", line 
> 598, in begin
>    self, nested=nested)
>  File "/misc/src/sqlalchemy/sqlalchemy/lib/sqlalchemy/orm/session.py", line 
> 223, in __init__
>    self._take_snapshot()
>  File "/misc/src/sqlalchemy/sqlalchemy/lib/sqlalchemy/orm/session.py", line 
> 271, in _take_snapshot
>    self.session.flush()
>  File "/misc/src/sqlalchemy/sqlalchemy/lib/sqlalchemy/orm/session.py", line 
> 1346, in flush
>    self._flush(objects)
>  File "/misc/src/sqlalchemy/sqlalchemy/lib/sqlalchemy/orm/session.py", line 
> 1427, in _flush
>    flush_context.execute()
>  File "/misc/src/sqlalchemy/sqlalchemy/lib/sqlalchemy/orm/unitofwork.py", 
> line 291, in execute
>    postsort_actions):
>  File "/misc/src/sqlalchemy/sqlalchemy/lib/sqlalchemy/topological.py", line 
> 31, in sort_as_subsets
>    (find_cycles(tuples, allitems), _dump_edges(edges, True)))
> 
> sqlalchemy.exc.CircularDependencyError: Circular dependency detected:
>  cycles: set([SaveUpdateState(<School at 0x8da616c>),
>  ProcessState(OneToManyDP(School.sedi), <School at 0x8da616c>,
>  delete=False)]) all edges: [(SaveUpdateState(<School at 0x8da616c>),
>  ProcessState(OneToManyDP(School.sedi), <School at 0x8da616c>,
>  delete=False)), (ProcessState(OneToManyDP(School.sedi), <School at
>  0x8da616c>, delete=False), SaveUpdateState(<School at 0x8da616c>)),
>  (SaveUpdateState(<School at 0x8da616c>), SaveUpdateState(<School at
>  0x8da616c>)), (SaveUpdateState(<School at 0x8da616c>),
>  SaveUpdateState(<School at 0x8da61ec>)),
>  (ProcessState(OneToManyDP(School.sedi), <School at 0x8da616c>,
>  delete=False), SaveUpdateState(<School at 0x8da61ec>))]
> 
> How can I further investigate what Is wrong from the setup of my GUI?
> 
> Thanks again
> sandro
> *:-)
> 
> 
> -- 
> Sandro Dentella  *:-)
> http://sqlkit.argolinux.org        SQLkit home page - PyGTK/python/sqlalchemy
> 
> -- 
> 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.
> 

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