Some additional info: Deleting an association instance (KeyphraseAction) directly from the session works:
kpa = s.query(KeyphraseAction).filter_by(keyphrase_id = kpId).all () for item in kpa: s.delete(item) s.commit() On Jun 2, 5:28 pm, hollister <a.hollister.willi...@gmail.com> wrote: > I have a many-to-many schema using an association object and the > association proxy. I'm able to add data via the ORM, but trying to > delete from the association (but not delete the left or right tables) > throws a "AssertionError: Dependency rule tried to blank-out primary > key column 'keyphrase_action.keyphrase_id' on instance > '<KeyphraseAction at 0x9da7d8c>'" error. My test code is below. Any > advice is appreciated! > > import os, sys > > from sqlalchemy import Column, Integer, String, Table, create_engine, > schema, types > from sqlalchemy import orm, MetaData, Column, ForeignKey > from sqlalchemy.orm import relation, mapper, sessionmaker > from sqlalchemy.ext.associationproxy import association_proxy > > engine = create_engine('sqlite:////home/aw/desktop/test.db', > echo=True) > > meta = MetaData(bind=engine) > > # schema > keyphrase_table = schema.Table('keyphrase', meta.metadata, > schema.Column('id', types.Integer, primary_key = True, > autoincrement = True), > schema.Column('phrase', types.String(160), nullable = False), > ) > > action_table = schema.Table('action', meta.metadata, > schema.Column('id', types.Integer, primary_key = True, > autoincrement = True), > schema.Column('action_name', types.Text, nullable = False), > ) > > keyphrase_action_table = schema.Table('keyphrase_action', > meta.metadata, > schema.Column('keyphrase_id', types.Integer, schema.ForeignKey > ('keyphrase.id'), primary_key = True), > schema.Column('action_id', types.Integer, schema.ForeignKey > ('action.id'), primary_key = True), > schema.Column('is_deferred', types.Boolean, nullable = False), > ) > > meta.create_all() > > # classes > class Keyphrase(object): > def __init__(self, phrase): > self.phrase = phrase > > # creator function > def _getKeyphraseAction(d): > return KeyphraseAction(action = d['action'], isDeferred = d > ['isDeferred']) > > actions = association_proxy('keyphrase_action', 'action', creator > = _getKeyphraseAction) > > class Action(object): > def __init__(self, name): > self.action_name = name > > class KeyphraseAction(object): > def __init__(self, keyphrase = None, action = None, isDeferred = > False): > self.keyphrase = keyphrase > self.action = action > self.is_deferred = isDeferred > > # mappers > mapper(Keyphrase, keyphrase_table) > mapper(Action, action_table) > > mapper(KeyphraseAction, keyphrase_action_table, properties={ > 'keyphrase': relation(Keyphrase, > backref = 'keyphrase_action'), > 'action': relation(Action), > }) > > # test code > Session = sessionmaker(bind=engine) > s = Session() > > # add some data > kp = Keyphrase('fast') > a = Action('capture_email') > > s.add(kp) > s.add(a) > s.commit() > > # assciate the keyphrase to the action > kp.actions.append({'action':a,'isDeferred':True}) > s.commit() > > #remove the newly created association, leaving the keyphrase and > actions > kp = s.query(Keyphrase).get(kp.id) > > for i, action in enumerate(kp.actions): > print action.action_name > kp.actions.remove(action) # this fails! > > s.commit() --~--~---------~--~----~------------~-------~--~----~ 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 sqlalchemy+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/sqlalchemy?hl=en -~----------~----~----~----~------~----~------~--~---