"dependency rule tried to blank out primary key" means:

1. A references B, B has a foreign key to A.

2. A is deleted.

3. each B associated with A must therefore have the foreign key of A set to 
NULL (this is the default behavior if 'delete' cascade isn't configured).

4. the foreign key on B is also part of the primary key.  SQLA detects this and 
raises an error.

The solution, B must also be deleted when A is deleted.

In your example, you're probably trying to do this as I see cascade="all, 
delete-orphan".  Except this cascade must go on the side that points A to B, in 
this case ObjectA.associations and ObjectB.associations (put it another way - 
the side that does *not* have the foreign key on it).    Since "associations" 
is on the "backref" side of the declaration here, use the backref() function 
and put "cascade='all, delete-orphan'" on that side.


On Aug 31, 2011, at 7:04 AM, Benjamin Sims wrote:

> Hi,
> 
> I'm still having troubles correctly figuring my various many-to-many 
> relations. Originally, this was a 'standard' many-to-many; that is, a 
> secondary table was specified.
> 
> However, I now need to add further information to the relation and am 
> converting into an AssociationObject. My problem is in ensuring that the 
> original calls still work. So, currently I have:
> 
> class Association(Base):
>    
>     __tablename__ = 'objecta_objectb'
>     objecta_id = Column(Integer, ForeignKey('objecta.id'), primary_key=True)
>     objectb_id = Column(Integer, ForeignKey('objectb.id'), primary_key=True)
>     objecta = relationship("ObjectA", backref = "associations", cascade = 
> 'all, delete-orphan')
>     objectb = relationship("ObjectB", backref = "associations", cascade = 
> 'all, delete-orphan')
>     
>     def __init__(self, objecta = None, objectb = None):
>         self.objecta = objecta
>         self.objectb = objectb
>         pass
> 
> class ObjectA(Base):
>     objectbs = association_proxy('associations', 'objectb', creator=lambda b:
>             Association(objectb=b))
> 
> class ObjectB(Base):
>     objectas = association_proxy('associations', 'objecta', creator=lambda a:
>             Association(objecta=a))
> 
> The point of all this is so that I can create the associations by doing:
> 
> objecta_instance.objectbs.append(objectb_instance)
> 
> or
> association_instance = Association(objectb = objectb_instance)
> objecta_instance.associations.append(association_instance)
> 
> Sorry if the above is rather convoluted; it is based on 
> http://www.preetk.com/node/sqlalchemy-part-2-declarative-bi-directional-association-classes/,
>  which is somewhat clearer.
> 
> Anyway, using the above I get:
> 
> AssertionError: Dependency rule tried to blank-out primary key column 
> 'objecta_objectb.objectb_id' on instance '<Association at 0x109277b90>'
> 
> What am I doing wrong? I understand that it is somehow related to how the 
> cascade is set up, but I'm not sure how to move forward.
> 
> Thanks,
> Ben
> 
> 
> 
> 
> 
> -- 
> 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