#===============================================================================
# I create many-to-many relation between A and B through
ab_association table.
# Then I create many-to-many relation between AB and C.
# When I try to break relation between A and B objects I get next
error:
#
# >>> a_obj.b_objects.remove(b_obj)
# >>> session.flush()
#
# raise exc.DBAPIError.instance(statement, parameters, e,
connection_invalidat
# ed=is_disconnect)
# sqlalchemy.exc.IntegrityError: (IntegrityError) update or delete
on table "ab_as
# sociations" violates foreign key constraint
"ab_c_associations_ab_id_fkey" on ta
# ble "ab_c_associations"
# DETAIL: Key (id)=(3) is still referenced from table
"ab_c_associations".
# 'DELETE FROM ab_associations WHERE ab_associations.a_id = %(a_id)
s AND ab_assoc
# iations.b_id = %(b_id)s' {'b_id': 3L, 'a_id': 3L}
#
# How can I use "cascade='delete'" for delete relation between AB and
C and avoid this error?
#
# Sorry for my English :(
#===============================================================================
from sqlalchemy import *
from sqlalchemy.orm import *
uri = 'postgres://postgres:passw...@localhost:5432/db'
engine = create_engine(uri, convert_unicode=True)
metadata = MetaData(engine)
a = Table('a', metadata,
Column('id', Integer, primary_key=True))
b = Table('b', metadata,
Column('id', Integer, primary_key=True))
c = Table('c', metadata,
Column('id', Integer, primary_key=True))
ab_associations = Table('ab_associations', metadata,
Column('id', Integer, primary_key=True),
Column('a_id', Integer, ForeignKey('a.id')),
Column('b_id', Integer, ForeignKey('b.id')),
UniqueConstraint('a_id', 'b_id')
)
ab_c_associations = Table('ab_c_associations', metadata,
Column('id', Integer, primary_key=True),
Column('ab_id', Integer, ForeignKey('ab_associations.id')),
Column('c_id', Integer, ForeignKey('c.id')),
UniqueConstraint('ab_id', 'c_id')
)
class A(object): pass
class B(object): pass
class C(object): pass
class AB(object): pass
mapper(A, a)
mapper(B, b, properties={
'a_objects': relation(A, secondary=ab_associations,
backref='b_objects')})
mapper(AB, ab_associations)
mapper(C, c, properties={
'ab_objects': relation(AB, secondary=ab_c_associations,
backref='c_objects')})
session = create_session()
metadata.create_all()
a_obj = A()
b_obj = B()
c_obj = C()
session.add(a_obj)
session.add(b_obj)
session.add(c_obj)
a_obj.b_objects.append(b_obj)
session.flush()
ab_obj = session.query(AB).filter_by(a_id = a_obj.id,
b_id=b_obj.id).all()[0]
ab_obj.c_objects.append(c_obj)
session.flush()
a_obj.b_objects.remove(b_obj)
session.flush()
--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---