Conor wrote:
> Kent wrote:
>   
>> 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?
>>
>>   
>>     
>
> You need to either manually keep strong references to each object that
> has the auxiliary information or disable the weak identity map. See
> http://www.sqlalchemy.org/docs/05/session.html#frequently-asked-questions
> or
> http://www.sqlalchemy.org/docs/05/session.html#frequently-asked-questions
> for more information.
>   

That second link should be
http://www.sqlalchemy.org/docs/05/session.html#session-attributes. Oops.

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

Reply via email to