a1.bs only loads something if there's nothing loaded already, or if the value 
was "expired".   

usually, as long as you keep objects associated with a Session, there's no need 
to worry about it as things load as they are needed.  but in that specific 
example, I'm moving an object from one session to another and trying to trip a 
condition that only shows up if the object were modified while it's "detached". 
  it isn't a usual thing.



On Mar 16, 2014, at 10:45 PM, Bao Niu <niuba...@gmail.com> wrote:

> Hi Michael,
> 
> It really works like magic! I mean the refreshing part. What exactly happens 
> when refreshinga1.bs? Does it actually replace the old b1 inside the 
> collection with a newer one? I can't wrap my mind around it. And more 
> importantly, does it mean I should *refresh* every attributes before close a 
> session, in order to carry their attribute over to the next session? 
> What is the reason not making such *refreshing* automatic by default???
> 
> Sorry for bringing up another question here.
> 
> 
> On Sun, Mar 16, 2014 at 10:58 AM, Michael Bayer <mike...@zzzcomputing.com> 
> wrote:
> 
> On Mar 15, 2014, at 7:41 PM, Bao Niu <niuba...@gmail.com> wrote:
> 
>> Thanks a lot Michael! Just a trivial question here, I noticed in your first 
>> reply you used:
>>  # refresh a1.bs
>> 
>> Why do we need to refresh it? I tried it in my terminal and it doesn't emit 
>> any sql. Is this one if those secret techniques that differentiate a 
>> sqlalchemy ninja and a newbie?;)
>> 
>> 
> 
> it should emit SQL, because the sess.commit() call above has expired the 
> collection.  in my script it fails down on "a1.bs.remove()" if i don't call 
> that first.
> 
> 
> 
> 
>> On Mar 15, 2014 8:31 AM, "Michael Bayer" <mike...@zzzcomputing.com> wrote:
>> you have every reason to be confused by that paragraph, which is using way 
>> too much terminology to express what's important there.   at some point, we 
>> had to add a behavior which I thought would be confusing to people, so that 
>> paragraph tries badly to explain what it is.  I should replace it with just 
>> a simple sentence and an example.  Here's the example:
>> 
>> from sqlalchemy import *
>> from sqlalchemy.orm import *
>> from sqlalchemy.ext.declarative import declarative_base
>> 
>> Base = declarative_base()
>> 
>> class A(Base):
>>     __tablename__ = 'a'
>> 
>>     id = Column(Integer, primary_key=True)
>>     bs = relationship("B")
>> 
>> class B(Base):
>>     __tablename__ = 'b'
>> 
>>     id = Column(Integer, primary_key=True)
>>     a_id = Column(Integer, ForeignKey('a.id'))
>> 
>> e = create_engine("sqlite://", echo=True)
>> Base.metadata.create_all(e)
>> 
>> sess = Session(e)
>> a1 = A()
>> b1 = B()
>> 
>> a1.bs = [b1]
>> 
>> sess.add(a1)
>> sess.commit()
>> 
>> a1.bs  # refresh a1.bs
>> sess.close()  # close out - sess is no longer associated with a1, b1
>> 
>> # all new session
>> sess2 = Session(e)
>> 
>> a1.bs.remove(b1)
>> 
>> sess2.add(a1)
>> 
>> # b1 was removed from a1.bs, but
>> # is in sess2 anyway! surprising!
>> assert b1 in sess2
>> 
>> # because we need it for the flush, it's still here:
>> from sqlalchemy import inspect
>> print inspect(a1).attrs.bs.history.deleted
>> 
>> 
>> 
>> 
>> 
>> 
>> On Mar 15, 2014, at 5:26 AM, Bao Niu <niuba...@gmail.com> wrote:
>> 
>>> I've read this paragraph 
>>> (http://docs.sqlalchemy.org/en/latest/orm/session.html#unitofwork-cascades) 
>>> many many times and still can't think of a practical example of what is 
>>> being discussed.
>>> 
>>> save-update cascade also cascades the pending history of the target 
>>> attribute, meaning that objects which were removed from a scalar or 
>>> collection attribute whose changes have not yet been flushed are also 
>>> placed into the target session. This is because they may have foreign key 
>>> attributes present which will need to be updated to no longer refer to the 
>>> parent.
>>> 
>>> I don't think my English is the main stumbling block here because I 
>>> understand the meaning of each word, but as soon as I'm putting them 
>>> together I'm completely lost. Could someone give a simple example here to 
>>> illustrate the main point in this paragraph please? Highly appreciated. 
>>> Thanks.
>>> 
>>> -- 
>>> 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 tosqlalchemy+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/d/optout.
>> 
>> 
>> -- 
>> You received this message because you are subscribed to a topic in the 
>> Google Groups "sqlalchemy" group.
>> To unsubscribe from this topic, 
>> visithttps://groups.google.com/d/topic/sqlalchemy/MSiBcFB3cFI/unsubscribe.
>> To unsubscribe from this group and all its topics, send an email 
>> tosqlalchemy+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/d/optout.
>> 
>> -- 
>> 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 tosqlalchemy+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/d/optout.
> 
> 
> -- 
> You received this message because you are subscribed to a topic in the Google 
> Groups "sqlalchemy" group.
> To unsubscribe from this topic, 
> visithttps://groups.google.com/d/topic/sqlalchemy/MSiBcFB3cFI/unsubscribe.
> To unsubscribe from this group and all its topics, send an email 
> tosqlalchemy+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/d/optout.
> 
> 
> -- 
> 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 tosqlalchemy+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/d/optout.

-- 
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/d/optout.

Reply via email to