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