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

Reply via email to