I thought of that later - that perhaps DBSession() calls upon a registry. That's entirely fine !
Session.add() and flush() can be called from within methods without issue. On Sep 2, 2011, at 12:43 PM, george hu wrote: > Thanks Michael, that gives me more understanding of using the session. > Actually the DBSession is initialized from: > DBSession = scoped_session(sessionmaker( > extension=ZopeTransactionExtension())) > > as the following description: > > ZopeTransactionExtension is a little piece that makes sure every session that > opens joins an active transaction. So if you were to open 5 session's, they > will all join the same transaction. That way if you commit or rollback the > transaction, all the work done by the either of the 5 sessions will follow > suit. The transaction module ("transaction.commit()") is key here. > > pyramid_tm tries to make setting up a transaction straightforward ... it > starts one upon request entry, all scoped database sessions join it... and > then at the end of the request, if it discovered an error, it will rollback > the transaction. Otherwise, the transaction will be committed. That way > view-level code never has to create or close/commit/rollback the transaction > manually. > > Mostly session.flush() is for making sure your database model instances get > their primary keys filled in without committing the transaction. > > So inside a view all you gotta do is: > > def myview(request): > > session = DBsession() > > session.add(model) > > pyramid_tm will make sure session is committed or rolled back appropriately. > > The session's discussion always makes me confusion, what about in my "model" > I define something like this: > > def foobar(self, session.....): > > session.add(self) > > > > > > > > > On Fri, Sep 2, 2011 at 6:58 AM, Michael Bayer <mike...@zzzcomputing.com> > wrote: > > On Sep 2, 2011, at 3:02 AM, Wichert Akkerman wrote: > > > On 09/02/2011 03:31 AM, Michael Bayer wrote: > >> With SQLAlchemy you should have an ongoing transaction/session defined > >> externally to individual operations on your mapped objects - SQLA uses the > >> "unit of work" pattern which specifically is about grouping related > >> persistence/query operations together. The usage you have above is still > >> thinking in the "active record" style of things - "session per individual > >> persistence operation" - and won't take full advantage of SQLA's way of > >> doing things. > > > > I can see this being useful if you need a id generated by a serial though. > > In places where I need something like that I use object_session(self), > > which seems to work well. > > > OK let me clarify - it is *entirely OK*, even encouraged, to make usage of > the Session inside of object methods. object_session(self) to do queries, > add() more things, as well as using a contextual Session to add() new objects > from within a @classmethod. This is commonplace and necessary. Use > Sessions freely anywhere and everywhere. > > What is *usually not needed*, is to create a brand new Session inside of an > object method, and then to commit() the transaction it uses. Usually, there > should be an external context that all objects are interfacing with, i.e., a > Session. If you don't have an ongoing context at all, and are adding "x = > Session(); x.add(self); x.commit()" inside of all your methods as the normal > way of doing things, that is definitely the wrong way to do it. > > The case where you *may* want to build a brand new Session and commit it > inside of a method is when you specifically want some operation to occur in a > transaction that is distinct from everything else that's going on ; I use > such a notion to write operations to a "logging" table in my app, so that a > web GUI can read that one table for status while some long operation is going > on, and also so that the log of activity remains if the long running > operation fails, and the transaction is rolled back. But even in that case, > I have a single function in my app called log() that's at the module level > which does this (with lots of behavioral options). > > The main thing I want to get across is, all apps should ideally have some > standard, defined-in-only-one-or-two-places system of initiating Sessions and > establishing where the scope of that Session ends for the majority of > operations, and you should catch yourself if you're trying to avoid building > that pattern that for some reason. > > -- > You received this message because you are subscribed to the Google Groups > "sqlalchemy" group. > To post to this group, send email to sqlalchemy@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 sqlalchemy@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 sqlalchemy@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.