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