I am fighting a bit of an odd issue (using SQLAlchemy 0.7.3). I have an account class, where each account has a list of strings managed via an association proxy. For a reason I can't seem to find the values are not persisted. The test case below demonstrates this: SQLAlchemy prints a "Object of type <Specialism> not in session, delete operation along 'Account._specialism' will not proceed" error and the first assert fails. Strangely enough if I remove the cascade on the _specialism relationship adding items does work correctly, but trying to remove them fails with a "Dependency rule tried to blank-out primary key column 'specialism.account_id'" error (which is expected).

from sqlalchemy import create_engine
from sqlalchemy import orm
from sqlalchemy import schema
from sqlalchemy import types
from sqlalchemy.ext.associationproxy import association_proxy
from sqlalchemy.ext.declarative import declarative_base


engine = create_engine('sqlite:///')
metadata = schema.MetaData()
BaseObject = declarative_base(metadata=metadata)
Session = orm.sessionmaker(bind=engine)


class Specialism(BaseObject):
    __tablename__ = 'specialism'

    account_id = schema.Column(types.Integer(),
            schema.ForeignKey('account.id',
                onupdate='CASCADE', ondelete='CASCADE'),
            primary_key=True)
    type = schema.Column(types.String(16), primary_key=True)

    def __init__(self, type):
        self.type = type


class Account(BaseObject):
    __tablename__ = 'account'

    id = schema.Column(types.Integer(),
            schema.Sequence('account_id_seq', optional=True),
            primary_key=True, autoincrement=True)

    _specialism = orm.relationship(Specialism,
            cascade='delete, delete-orphan')
    #: List of :term:`specialisms<article specialism>` this account is
    #: authorized for.
    specialisms = association_proxy('_specialism', 'type')


metadata.create_all(engine)
session = Session()

account = Account()
session.add(account)
account.specialisms = ['foo', 'bar']
assert session.query(Specialism).count() == 2
session.flush()
account.specialisms = ['buz']
session.flush()
assert session.query(Specialism).count() == 1


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