Thanks for replying. Isn't it the case when I just provide a primary key for the source object, the attribute shoul be marked expired on the target instance? In my example I only give the object u a primary key value, so the newly created object should be an object that only has a primary key value and "wipe out" other attributes originally for that row in the table. However the result is that row stays unchanged after all my instructions. Is there something I missed here? On Feb 19, 2014 6:47 AM, "Michael Bayer" <mike...@zzzcomputing.com> wrote:
> > On Feb 19, 2014, at 6:08 AM, Bao Niu <niuba...@gmail.com> wrote: > > I thought I understood the behaviour of session.merge() from reading the > documentation, but I'm wrong. Here is an example. I have codes below, > > class User(Base): >> __tablename__ = 'user' >> id = Column(Integer, primary_key=True) >> name = Column(String(50), nullable=False) >> addresses = relationship("Address", backref="user") > > This class has a corresponding table 'user' which has already been > populated with one row, with its primary key equal to 1. > Now I run the following instructions from python -i: > >> >>> u = User(id=1) >> >>> session.merge(u) >> >>> session.commit() > > I expected that there should be a sqlalchemy.orm.exc.FlushError, because > both object u (which has been merged) and the row which has been already in > the table have their primary key equal to 1. However, nothing happened. > Sqlalchemy just ignored that merged u! > If I do these instructions: > >> >>> session.add(u) >> >>> session.commit() > > Then I got a sqlalchemy.orm.exc.FlushError, which was expected. > > So, session.merge() does not include .add()? From the documentation it > seems that it does. > > > So first is that the object you pass to merge() is *never* itself added to > the session. The object you pass in is unmodified. The return value of > merge() is the object that is actually in the Session. This object will > either have been newly created, in which case it was added using add(), or > it was loaded from the database. But that object is never the one you > passed in. > > So in your test if primary key "1" already exists, then merge() returned > the User object it had for that primary key. > -- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To unsubscribe from this group and stop receiving emails from it, send an email to sqlalchemy+unsubscr...@googlegroups.com. To post to this group, send email to sqlalchemy@googlegroups.com. Visit this group at http://groups.google.com/group/sqlalchemy. For more options, visit https://groups.google.com/groups/opt_out.