"delete-orphan" on the "A" relationship means, "no A is allowed to
exist in the database without a parent B".  the rule used to be more
lax and would only fire off when an A was removed from a B...but that
missed a lot of cases.   the specificness of the error message
indicates its definitely not a bug :)


On Feb 1, 7:24 am, Manlio Perillo <[EMAIL PROTECTED]> wrote:
> Hi.
>
> I still do not fully understand cascade rules, however I want to be sure
> the behaviour below is a feature and not a bug.
>
> Here is the code:
>
> from sqlalchemy import *
>
> db = create_engine('postgres://manlio:[EMAIL PROTECTED]/test', echo=False)
>
> metadata = BoundMetaData(db)
> a = Table(
>      'a', metadata,
>      Column('id', Integer, primary_key=True),
>      Column('x', String)
>      )
>
> b = Table(
>      'b', metadata,
>      Column('uid', String, primary_key=True),
>      Column('id', Integer, ForeignKey(a.c.id)),
>      Column('y', String)
>      )
>
> class A(object):
>      def __init__(self,  x):
>          self.x = x
>
> class B(object):
>      def __init__(self, id, y):
>          self.id = id
>          self.y = y
>
> aMapper = mapper(A, a)
>
> bMapper = mapper(
>      B, b,
>      properties={
>          'a': relation(
>              A, lazy=False, cascade='all, delete-orphan'
>              )
>          }
>      )
>
> try:
>      metadata.create_all()
>
>      conn = db.connect()
>      trans = conn.begin()
>      sess = create_session(bind_to=conn)
>
>      obj = A('x')
>      sess.save(obj)
>
>      sess.flush()
>      sess.close()
>      trans.commit()
>      conn.close()
> finally:
>      metadata.drop_all()
>
> When executing this script I obtain:
>
> Traceback (most recent call last):
>    File "cascade.py", line 52, in ?
>      sess.flush()
>    File "/usr/lib/python2.4/site-packages/sqlalchemy/orm/session.py",
> line 220, in flush
>      self.uow.flush(self, objects)
>    File "/usr/lib/python2.4/site-packages/sqlalchemy/orm/unitofwork.py",
> line 175, in flush
>      if object_mapper(obj)._is_orphan(obj):
>    File "/usr/lib/python2.4/site-packages/sqlalchemy/orm/mapper.py",
> line 232, in _is_orphan
>      raise exceptions.FlushError("instance %s is an unsaved, pending
> instance and is an orphan (is not attached to %s)" %
> sqlalchemy.exceptions.FlushError: instance <__main__.A object at
> 0xb79d946c> is an unsaved, pending instance and is an orphan (is not
> attached to any parent 'B' instance via that classes' 'a' attribute)
> [EMAIL PROTECTED]:~/projects/bugs/sqlalchemy$ python cascade.py
> Traceback (most recent call last):
>    File "cascade.py", line 52, in ?
>      sess.flush()
>    File "/usr/lib/python2.4/site-packages/sqlalchemy/orm/session.py",
> line 220, in flush
>      self.uow.flush(self, objects)
>    File "/usr/lib/python2.4/site-packages/sqlalchemy/orm/unitofwork.py",
> line 175, in flush
>      if object_mapper(obj)._is_orphan(obj):
>    File "/usr/lib/python2.4/site-packages/sqlalchemy/orm/mapper.py",
> line 232, in _is_orphan
>      raise exceptions.FlushError("instance %s is an unsaved, pending
> instance and is an orphan (is not attached to %s)" %
> sqlalchemy.exceptions.FlushError: instance <__main__.A object at
> 0xb79a146c> is an unsaved, pending instance and is an orphan (is not
> attached to any parent 'B' instance via that classes' 'a' attribute)
>
> Thanks and regards  Manlio Perillo


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to sqlalchemy@googlegroups.com
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