I agree I shouldn't care, so maybe there is another way to attack my problem. The reason I care is because I've extended the python object with some auxiliary information that I need. After the refresh() in this case, I still need access to that data that is tied to the object, but not present in the database (it is transient data). If sqla creates a new instance, I loose that data.
Is there a better mechanism for doing that? On Mar 4, 3:38 pm, "Michael Bayer" <mike...@zzzcomputing.com> wrote: > refresh doesn't remove any objects from the session so its a matter of > what is present in the session, not marked as dirty, and strongly > referenced on the outside. if you're using refresh you shouldn't care > about how it gets data back into the collection. > > Kent wrote: > > What's strange is that I can't recreate the problem on more simple > > stage. Every time I refresh() on the parent object, the list objects > > remain the same. In other words, *sometimes* it behaves as I hope it > > to (by apparently refreshing the list's objects) and *sometimes* if > > throws them out and creates new ones. The mystery to me is what > > determines when it will create new instances vs. refreshing the > > existing ones? > > > On Mar 4, 3:24 pm, "Michael Bayer" <mike...@zzzcomputing.com> wrote: > >> Kent wrote: > >> > If I use session.refresh(obj) to re-load an obj that has a one-to-many > >> > relational property, the objects in the list are *replaced* instead of > >> > *refreshed* if they already exist. > > >> > Suppose department has a list of employees: > > >> > suppose dept.employees = [ emp1, emp2 ] > > >> > session.refresh(dept) > > >> > the dept."employees" list's elements are replaced with new objects > >> > instead of reusing those that existed and refreshing them. > > >> > Is it possible to have those same objects re-used and simply refreshed > >> > instead of replaced? > > >> you can only turn off "refresh-expire" cascade, which will prohibit the > >> operation from traveling into the child objects. the collection is > >> still > >> refreshed for obvious reasons, its one of the attributes on your mapped > >> object. > > >> To achieve your specified behavior, use session.refresh() given as its > >> second argument the set of attribute names which are safe to be reloaded > >> completely (in this case the scalars). Then for each uselist > >> attribute, > >> iterate the collection of each and call the desired version of > >> session.refresh() for those. > > >> This is an easy refresh() function to create in a generalized way by > >> inspecting the class-level attributes of the incoming object. > > >> > -- > >> > 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. > > -- 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.