scoped_session is a "decorator" (in the OOP sense, not in the Python sense) to 
an actual Session instance, which it gets by consulting the threading.local().

The concepts underlying this idea are described in these links:

http://en.wikipedia.org/wiki/Thread-local_storage

http://en.wikipedia.org/wiki/Decorator_pattern - note that "traditional" design 
patterns like these are much simpler in dynamic languages like Python.









On Oct 10, 2013, at 2:36 PM, Saju M <[email protected]> wrote:

> Thanks michael,
> Could you please explain, how  sqlalchemy overriding the global variable 
> 'Session' inside the threads.
> 
> How Transaction.Commit() inside the thread commit only the objects associated 
> with overrided 'Session'
> Just for learning.
> 
> Thanks
> 
> On Oct 10, 2013 11:42 PM, "Michael Bayer" <[email protected]> wrote:
> threading.local() isn't a global registry.  the threading.local() you want is 
> here:
> 
>       Session = scoped_session(sessionmaker())
> 
>       registry = Session.registry
> 
>       the_threading_local = registry.registry
> 
> there is no need to directly access this threading local.   Source for this 
> activity is first in scoped_session:
> 
> https://github.com/zzzeek/sqlalchemy/blob/master/lib/sqlalchemy/orm/scoping.py#L16
> 
> then ThreadLocalRegistry:
> 
> https://github.com/zzzeek/sqlalchemy/blob/master/lib/sqlalchemy/util/_collections.py#L917
> 
> 
> 
> 
> 
> On Oct 10, 2013, at 11:29 AM, sajuptpm <[email protected]> wrote:
> 
>> Could someone please explain, Howto sqlalchemy creating new Session and 
>> connection inside the thread.
>> Please check the attached programme and output. 
>> 
>> I went through the doc 
>> http://docs.sqlalchemy.org/en/latest/orm/session.html#thread-local-scope
>> 
>> and find that sqlalchemy using "threading.local()" to do this magic, but I 
>> could not seen any thing in "threading.local()" (see output of the 
>> programme)  
>> 
>> 
>> 
>> ####### Test Code and Output #######
>> 
>> from sqlalchemy import * 
>> from sqlalchemy.orm import * 
>> from sqlalchemy.ext.declarative import declarative_base 
>> Base = declarative_base() 
>>  
>> e = create_engine("mysql://root:
>> xxxxx@localhost/xxxxx")
>> Session = scoped_session(sessionmaker(e)) 
>> 
>> import threading
>> from functools import wraps
>> def find_connection_id_deco(func):
>>     """
>>     """
>>     @wraps(func)
>>     def wrap1(*args, **kwargs):
>>         """
>>         """
>>         gls = func.__globals__
>>         _DBSession = gls.get("Session")
>>         if _DBSession:
>>             res1 = _DBSession.connection().execute("SELECT connection_id()")
>>             if res1:
>>                 conn_id = res1.fetchone()[0]
>>                 print "@@@@%s===%s()===conn_id_1===%s===%s===%s===%s===" \
>>                 %(func.func_code.co_filename, func.__name__, conn_id, 
>> vars(threading.local()),\
>>                     threading.currentThread().getName(), 
>> threading.currentThread().ident)
>>         return func(*args, **kwargs)
>>     return wrap1
>> 
>> 
>> @find_connection_id_deco
>> def test1():
>>     """
>>     """
>>     print "test1"
>> 
>> 
>> @find_connection_id_deco
>> def test2():
>>     """
>>     """
>>     print "test2"
>> 
>>  
>>  
>> from threading import Thread 
>> test1()
>> thread = Thread(target=test2)
>> thread.start()
>> 
>> 
>> OUTPUT
>> #######
>> @@@@cvt_test_script.py===test1()===conn_id_1===661==={}===MainThread===139917239523072===
>> test1
>> @@@@cvt_test_script.py===test2()===conn_id_1===662==={}===Thread-1===139917193123584===
>> test2
>> 
>> -- 
>> 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 [email protected].
>> To post to this group, send email to [email protected].
>> Visit this group at http://groups.google.com/group/sqlalchemy.
>> For more options, visit https://groups.google.com/groups/opt_out.
> 
> 
> -- 
> 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 [email protected].
> To post to this group, send email to [email protected].
> Visit this group at http://groups.google.com/group/sqlalchemy.
> For more options, visit https://groups.google.com/groups/opt_out.

Attachment: signature.asc
Description: Message signed with OpenPGP using GPGMail

Reply via email to