On Oct 29, 2010, at 9:39 PM, Conor wrote: >> I have a table (T) that has a many-to-one relationship (via foreign key >> inclusion) to a category table (C). Let's name the relationship category. >> When I retrieve an existing T record, SA populates the category field with >> an instance of C. I can change the category to a different value by storing >> a different instance of C into category. > Technically, SQLAlchemy by default does not populate the "category" relation > until you access it the first time (i.e. it is a lazy load). > >> My question is does it matter if the various instances of C are associated >> with the same session as the T instance? > I'm not sure what you mean here. There is no problem having multiple C > instances in the same session as the T instance. SQLAlchemy will complain > (hopefully; I haven't tried it) if multiple C instances in the same session > share a primary key. > >> Can the C instances come from a different session, or can the be expunge'd >> from the session that retrieved them? > The only restriction is, if the T instance is part of session S, then the C > instance that you assign to T.category must be part of S or not be part of > any session. It is allowed if you first expunge the C instance from another > session and merge it into S before assigning it to T.category. >
Thanks, that was what I was asking. I think I've tested it with C instances belonging to the same session and to C instances that have been expunged, but I didn't test C instances that were still an active part of a different session. > Note that there are only a few use cases for moving instances from one > session to another that I am aware of: > > Caching query results. You expunge the instances from the original session, > keep them around in memory (or serialized to disk, memcache, etc.). Then you > can merge them back into subsequent sessions to avoid repeated DB queries. > Passing objects between threads. Sessions are not thread-safe, so if you want > to pass objects from thread A to thread B, you have to merge session A's > objects into session B before thread B can use them. >> Can I store an entirely new C instance, and if so, will SA do an insert into >> the C table? > Yes, this is part of the "save-update" cascade[1] which is enabled by default > on a relationship. Generally you only worry about cascade for one-to-many or > many-to-many relationships. At least that's my experience. > Mark -- 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.
