1. 程式人生 > >Flask ==> scoped_session

Flask ==> scoped_session

括號 cto class 基礎上 engine 寫法 execute delete 小結

Flask ==> scoped_session

        from sqlalchemy.orm import sessionmaker
        from sqlalchemy import create_engine
        from sqlalchemy.orm import scoped_session
        engine = create_engine(
                "mysql+pymysql://root:[email protected]:3306/s6?charset=utf8",
                max_overflow
=0, # 超過連接池大小外最多創建的連接 pool_size=5, # 連接池大小 pool_timeout=30, # 池中沒有線程最多等待的時間,否則報錯 pool_recycle=-1 # 多久之後對線程池中的線程進行一次連接的回收(重置) ) SessionFactory = sessionmaker(bind=engine) # 方式一:由於無法提供線程共享功能,所有在開發時要註意,在每個線程中自己創建 session。 #
from sqlalchemy.orm.session import Session # 自己具有操作數據庫的:‘close‘, ‘commit‘, ‘connection‘, ‘delete‘, ‘execute‘, ‘expire‘,..... session = SessionFactory() # print(‘原生session‘,session) # 操作 sql語句 session.close() # 方式二:支持線程安全,為每個線程創建一個session,單線程就不會創建多個。
# - threading.Local 用過的地方:數據庫連接池 # - 唯一標識 用過的地方:session,request,gevent,app # ScopedSession對象 # self.registry(), 加括號 創建session # self.registry(), 加括號 創建session # self.registry(), 加括號 創建session from greenlet import getcurrent as get_ident session = scoped_session(SessionFactory,get_ident) # get_ident(): 可以獲取當前線程的唯一標識 # session.add # 操作 sql語句 session.remove()

小結:

  1.scoped_session的的功能: 支持了線程安全。

    方式一:手動維護,各種操作都需要自己完成。由於無法提供線程共享功能,所有在開發時要註意,在每個線程中自己創建 session。

    方式二:支持線程安全,為每個線程創建一個session,單線程就不會創建多個。

            - threading.Local 用過的地方:數據庫連接池

            - 唯一標識 用過的地方:session,request,gevent,app

  2.兩種方式的寫法不一樣,但是,它們的本質是一樣的。還是操作原生sql的基礎上(方式1),(方式2)在(方式1)的基礎上,多加了個線程安全。

   通過local本地實現的。get_ident(): 可以獲取當前線程的唯一標識

 

Flask ==> scoped_session