you've removed the "save-update" cascade which is why Specialism doesn't get 
into the Session.    the warning there is a new thing to give you a heads up on 
that fact (I get it for the "add" message).    cascade should be "all, delete, 
delete-orphan" here.



On Nov 1, 2011, at 11:39 AM, Wichert Akkerman wrote:

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

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