Thank you very much for the answers.

No doubts for now.

2011/3/18 Michael Bayer <mike...@zzzcomputing.com>

>
> On Mar 18, 2011, at 2:55 PM, Israel Ben Guilherme Fonseca wrote:
>
> > Hi everybody,
> >
> > I'm new with SQLAlchemy and I'm trying to understand better the Session
> object.
> >
> > First of all, why the expire_all() exists?
>
> The purpose is to remove any database-loaded state from all current objects
> so that the next access of any attribute, or any query execution, will
> retrieve new state, freshening those objects which are still referenced
> outside of the session with the most recent available state.   It is called
> automatically upon commit() or rollback() assuming an autocommit=False
> session, so that when the transaction, and its isolated environment, come to
> an end, subsequent accesses of those objects will acquire new data from
> whatever other transactions were committed subsequent to the previous
> transaction.   expire_all() itself is useful when:
>
> - the session is used in autocommit=True mode, and new changes from other
> transactions are desired.
> - against a database that does not support transactions, or perhaps within
> a weakly isolated transaction, again to load changes from other transactions
> or connections.
> - when SQL statements have been executed against the current transaction
> using execute() which may have changed significant portions of loaded state
> on the database.
>
>
> > Shouldn't it be always better to expunge_all() instead? If it is expired,
> at the use of the instance another query would be issued to reattach it
> anyway, so why keep "useless" instances in the identity map (maybe i'm wrong
> about this fact, i dont know exactly how the identity map works).
>
> They're not useless at all if you are performing operations upon them which
> span the scope of multiple transactions, or have any of the above use cases,
> and don't wish to re-establish a full graph of objects in memory.
> In-memory objects are essentially proxy objects to an underlying database
> transaction.  The Session mediates this relationship.
>
>
> >
> > Second, when we should call the close() method?
>
> when you wish to release the transactional and connection pool resources of
> the Session and remove all objects.
>
>
> > I dont think if i get it at all. Let's say that I have the following DAO:
> >
> > PersonDAO:
> >     def insert(self, person):
> >          session = Session()
> >          session.add(person)
> >          session.commit() // why the commit starts a new transaction?
> should'n it only start again the next database access?
>
> the commit ends the current transaction, and starts a new transaction from
> the Session's point of view.  However, no SQL or transactional directives
> are emitted until the first SQL statement is emitted via the Session (either
> via execute(), query() iteration, or flush). So there is no new database
> transaction if you commit then cease to use that Session further.
>
> >          session.close() // is it necessary?
>
> Not strictly although it removes any state left over in the session,
> thereby establishing any remaining objects as detached.  This is desirable
> since you might want to ensure that subsequent operations on those objects
> don't re-emit new SQL.
>
> >
> > Is the a Session instance directly associated to a Connection in the
> pool?
>
> Yes.  This is documented here:
> http://www.sqlalchemy.org/docs/orm/session.html#what-does-the-session-do
>
> > With the default pool size of 5, after 5 call of the insert method, the
> connection_overflow would be used?
>
> No.  A single session uses one Connection per Engine at a time.  By
> default, it keeps one connection open until rollback(), commit(), or close()
> is called.
> http://www.sqlalchemy.org/docs/orm/session.html#managing-transactionsillustrates
>  this.
>
> > What's the time to a Session "expire"?
>
> it expires things when commit or rollback is called.    This is also in the
> above docs.
>
> >
> > And just to finish. Why do we use remove() for the scoped_session instead
> of the close()?
>
> scoped_session offers all of the methods of the underlying Session via a
> proxy pattern, so you can call close() on scoped_session, which calls
> close() on the actual session, or you can call remove(), which emits close()
> then removes the Session object itself from the registry.  The latter has
> the advantage that any particular state established on the session, such as
> a Connection-based bind (see the example in
> http://www.sqlalchemy.org/docs/orm/session.html#joining-a-session-into-an-external-transaction),
>  or other particular constructor options, are discarded.
>
>
> > Shouldn't it be semantically identical only overrided for the contextual
> stuff?
>
> this would be scoped_session.close().   The distinction is discussed to
> some degree at
> http://www.sqlalchemy.org/docs/orm/session.html#lifespan-of-a-contextual-session.
>
>
>
> >
> > --
> > 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.

Reply via email to