that's very likely to be a bug related to the new unit of work.   I've added 
#1807 which is on a high priority 0.6.1 track, will try to get it in before 
0.6.1 release.


On May 19, 2010, at 3:34 PM, Brad Wells wrote:

> In upgrading to 0.6.0 I've found a regression in behavior for
> relationships with backrefs that require post_update=True.
> 
> from sqlalchemy import Table, Column, Integer, String, MetaData,
> create_engine, ForeignKey, ForeignKeyConstraint
> from sqlalchemy.orm import relation, sessionmaker, scoped_session,
> synonym, object_session, mapper, backref
> 
> engine = create_engine('sqlite:///', echo=False)
> 
> Session = scoped_session(sessionmaker(autoflush=True,
> autocommit=False, bind=engine))
> metadata = MetaData()
> 
> contacts = Table('contacts', metadata,
>              Column('id', Integer, primary_key=True),
>              Column('name', String(35)),
>              Column('account_id', Integer),
>              ForeignKeyConstraint(['account_id'], ['accounts.id']))
> 
> accounts = Table('accounts', metadata,
>                 Column('id', Integer, primary_key=True),
>                 Column('name', String(35)),
>                 Column('created_by_id', Integer),
>                 ForeignKeyConstraint(['created_by_id'],
> ['contacts.id'], name='fk1', use_alter=True))
> 
> class Contact(object): pass
> class Account(object): pass
> 
> mapper(Contact, contacts, properties={
>    'account': relation(Account,
> 
> primaryjoin=contacts.c.account_id==accounts.c.id,
>                        post_update=True,
>                        #backref=backref('contacts', post_update=True)
>                        backref='contacts'
>                        )
> })
> mapper(Account, accounts, properties={
>    'created_by': relation(Contact,
> primaryjoin=accounts.c.created_by_id==contacts.c.id),
>    #'contacts': relation(Contact,
> primaryjoin=accounts.c.id==contacts.c.account_id)
> })
> 
> metadata.create_all(bind=engine)
> 
> # create basic data
> frank = Contact()
> frank.name = "Frank"
> Session.add(frank)
> 
> finc = Account()
> finc.name = "Frank Inc."
> frank.account = finc
> Session.add(finc)
> 
> Session.commit()
> Session.expunge_all()
> 
> # reproduce the problem
> bob = Contact()
> bob.name = 'Bob'
> Session.add(bob)
> 
> frank = Session.query(Contact).filter_by(name='Frank').first()
> finc = frank.account
> 
> bob.account = finc
> 
> assert bob.account == finc
> Session.commit()
> assert bob.account == finc
> 
> If either backref on the 'account' relation of Contact is set then the
> UPDATE fails to issue. If the 'contacts' relation is defined directly
> on Account or the backref isn't defined at all then everything works
> as expected. This is tested on SQLAlchemy 0.6.0 with Python 2.6. I
> verified this as working under 0.5.8.
> 
> -- 
> You received this message because you are subscribed to the Google Groups 
> "sqlalchemy" group.
> To post to this group, send email to sqlalch...@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 sqlalch...@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