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 sqlalch...@googlegroups.com.
To unsubscribe from this group, send email to 
sqlalchemy+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en.

Reply via email to