sqlalchemy中的scoped_session(session_maker())或plain session_maker()?

时间:2011-06-29 10:58:29

标签: python django orm sqlalchemy flask-sqlalchemy

我在我的网络项目中使用SQlAlchemy。我应该使用scoped_session(session_maker())或plain session_maker()以及为什么?或者我应该使用其他东西?

## model.py
from sqlalchemy import *
from sqlalchemy.orm import *

engine = create_engine('mysql://dbUser:dbPassword@dbServer:dbPort/dbName',
pool_recycle=3600, echo=False)
metadata = MetaData(engine)
Session = scoped_session(sessionmaker())
Session.configure(bind=engine)
user = Table('user', metadata, autoload=True)

class User(object):
pass

usermapper = mapper(User, user)

## some other python file called abc.py
from models import *

def getalluser():
   session = Session()  
   session.query(User).all()
   session.flush()
   session.close()

## onemore file defg.py
from models import *

def updateuser():
   session = Session()  
   session.query(User).filter(User.user_id == '4').update({User.user_lname: 'villkoo'})
   session.commit()
   session.flush()
   session.close()

我为每个请求创建一个session = Session()对象,然后关闭它。我做对了还是有更好的方法吗?

4 个答案:

答案 0 :(得分:26)

建议阅读documentation

  

提供了scoped_session()函数,该函数生成Session对象的线程管理注册表。它通常用于Web应用程序,因此可以使用单个全局变量来安全地表示具有对象集的事务会话,并将其本地化为单个线程。

简而言之,使用scoped_session()来保证线程安全。

答案 1 :(得分:9)

每个方法都有Scoped_session,因为它会为你提供一个你无法预先获得的本地会话线程(比如在模块级别)。不需要在每个方法中打开一个新会话,你可以使用全局会话,创建一个仅当全局会话不可用时才会话。即你可以编写一个方法来返回一个会话并将其添加到你的包中的 init .py。

答案 2 :(得分:1)

仅供参考,在使用flask-sqlalchemy时,默认情况下,提供的会话对象是作用域内的会话对象。

enter image description here

http://flask-sqlalchemy.pocoo.org/2.3/quickstart/#road-to-enlightenment

答案 3 :(得分:0)

我自己也在研究这个问题,但我不是专家。

我的三点是: (i)根据上述Kluev先生的评论,SQLAlchemy docs提供了一个使用scoped_session的建议方法,链接在http://docs.sqlalchemy.org/en/rel_0_9/orm/session.html#using-thread-local-scope-with-web-applications。 (ii)在该Web位置,SQLAlchemy文档也说它是#34; ...强烈建议使用随Web框架提供的集成工具(如果可用),而不是scoped_session。" (iii)例如,Flask-SQLAlchemy似乎声称它会照顾到这一点:http://pythonhosted.org/Flask-SQLAlchemy/quickstart.html#a-minimal-application