Hi Mike,

Thanks so much for the reply and the pointer.

Since I never added anything to the session explicitly, I think I was 
missing that loading an object implicitly adds that object to the session - 
which does make sense.

Is that right ?

thanks again,
terry


On Monday, June 15, 2015 at 11:26:39 AM UTC-4, Michael Bayer wrote:
>
>  
>
> On 6/15/15 11:12 AM, T Mark wrote:
>  
> Hi there, 
>
>  I have been pulling my hair out on this one.
>
>  I understood that objects make it into the session only due to an 
> explicit call to add().  
>  
> or if they are associated with a parent object that is added to the 
> Session via add(), or if they are associated with an object that is already 
> present in a Session via add(); this also will occur for backrefs, e.g. A 
> is in the session, B.a is referred to A, B.a has a backref A.bs, therefore 
> B is now added.   This is configurable.
>
>
>  But, I seem to be seeing objects being added without my explicitly doing 
> so.  Is this to be expected ?
>  
>
> yes.  please see: 
> http://docs.sqlalchemy.org/en/rel_1_0/orm/cascades.html?highlight=cascades
>
>
>  
>  For instance, I want to establish a many-to-many relationship between 
> two classes: say, for the purposes here, "Person" and "Kid".
>
>  
> test=> create table persons (id SERIAL NOT NULL);
> test=> CREATE TABLE person_to_kids (person_id INT NOT NULL, kid_id INT 
> NOT NULL);
> test=> create table kids (id SERIAL NOT NULL, name TEXT NOT NULL);
> test=> insert into  kids (name) VALUES ('Fred');
> test=> insert into  kids (name) VALUES ('Barney');
>
> person_to_kids = Table('person_to_kids',
>                         Base.metadata,
>                         Column('person_id', Integer, ForeignKey('
> persons.id')),
>                         Column('kid_id', Integer, ForeignKey('kids.id')))
> class Person(Base):
>
>      __tablename__ = 'persons'
>     id = Column('id', Integer, primary_key = True)
>     def __init__(self,
>                  kids = []):
>
>          kids = Kid.get_kids(kid_names = kids)
>
>          print("__init__ before kids assignment")
>         print(session.new)
>
>         """ Assigning to self.kids here seems to add self to session ??? 
> """
>
>          self.kids=kids
>         print("After assignment to self.kids")
>         print(session.new)
>
>  
>  class Kid(Base):
>     __tablename__ = 'kids'
>     id = Column(Integer, primary_key = True)
>     name = Column(String)
>     parents = relationship("Person",
>                                secondary = person_to_kids,
>                                backref="kids")
>
>      def __init__(self, name = None):
>         self.name = name
>
>      @staticmethod
>     def get_kids(kid_names = []):
>
>          kids = []
>
>          for name in kid_names:
>             # find first kid
>             target_set = session.query(Kid).filter(Kid.name == 
> name).first()
>             kids.append(target_set)
>
>          return kids
>
>    
>
>  What is puzzling me is that, if I have a collection of Kid objects, and 
> I assign it to the kids collection in a Person, the Person object seems to 
> be automatically added to the session and marked as pending, even if I have 
> not added it. 
>
>  For instance, if the Persons table is empty:
>
>   test=> select * from persons;
>  id
> ----
> (0 rows)
>
>   
>
>  and I run the following code:
>  
>    print(session.new)
> obj = Person(kids = ['Barney', 'Fred'])
> print("obj has been created")
> print(session.new)
> session.commit()
>
>   
> The output shows that the Person object is added immediately after the 
> assignment to obj.kids, without any call to session.add() anywhere in the 
> code:
>
>   IdentitySet([])
>  __init__ before kids assignment
> IdentitySet([])
> After assignment to self.kids
> IdentitySet([<__main__.Person object at 0x7fb6ce447b10>])
> obj has been created
> IdentitySet([<__main__.Person object at 0x7fb6ce447b10>])
>
>  
> And indeed, due to the commit() at the end, the person object makes it 
> into the database:
>
>   test=> select * from persons;
>  id
> ----
>  10
> (1 row)
>
>   
>
>  But, I understood that objects (only) make it into a session by virtue 
> of being explicitly added.
>  
> So, is this the correct behavior, or am I misunderstanding something ?
>
>  If I'm not misunderstanding this all, the complete code is at 
> https://github.com/NuggyBuggy/sqlalchemy_question.git .
>  
>  Thanks for reading,
> terry
>  -- 
> 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+...@googlegroups.com <javascript:>.
> To post to this group, send email to sqlal...@googlegroups.com 
> <javascript:>.
> 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