Flask ==> scoped_session
阿新 • • 發佈:2018-01-13
括號 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