Thanks Michael! I've got a small bug in my get_from_dto - I was getting object from db, and that was reason the object was updating.
On Apr 8, 7:42 pm, Michael Bayer <[email protected]> wrote: > On Apr 8, 2011, at 12:59 PM, gwozdziu wrote: > > > > > #before executing this code we have object with id = 5 in our database > > > obj = self.mapper.get_from_dto(dto) # creating the object from values > > provided by user , this object has id = 5 > > self.mapper.add(obj) # we are putting new object (with id = 5). > > It > > conflicts with already existing object > > self.mapper.commit() # commit. New object overrides old one > > this all depends on what get_from_dto() does. If it says: > > obj = MyObject(<values from the user>) > > now "obj" is known as "transient". When you add() it to the session, it > becomes "pending". When flush() proceeds, you will get an Integrity Error if > ID # 5 already exists. If you want to merge the values from MyObject onto a > possibly already existing object in the DB, you use merge: obj = > session.merge(obj). > > On the other hand, if get_from_dto() says: > > obj = session.query(MyObject).get(5) > > then "obj" is "persistent", and is already in the session. Calling > session.add(obj) has no net change. There's no error but also nothing has > actually happened. > > Finally, if get_from_dto() is more like: > > obj = some_other_session.query(MyObject).get(5) > some_other_session.close() > > then "obj" is detached. When you call session.add(obj), "obj" becomes the > object that represents row #5 in the session. This might be what you're > looking for, but this is an unusual case. There is of course no error > because you are handing the Session an object that is detached, and becomes > persistent again - it represents row #5 from the database already, so its the > correct row, though it may be out of date. If you've done something to it > that you don't want to persist, that's more on your end, but it's a little > strange your application isn't able to be aware of that much sooner. > > Anyway, you can test for "identity" using: > > from sqlalchemy.orm.util import has_identity > if not has_identity(obj): > session.add(obj) > > if the case is as simple as, the row is out of date and you want to guard > against that, you can use a version_id_col for that use case - it will raise > if the version you give to the session is older than what's currently in the > database. -- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/sqlalchemy?hl=en.
