我在我的网络项目中使用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()对象,然后关闭它。我做对了还是有更好的方法吗?
答案 0 :(得分:26)
建议阅读documentation:
提供了scoped_session()函数,该函数生成Session对象的线程管理注册表。它通常用于Web应用程序,因此可以使用单个全局变量来安全地表示具有对象集的事务会话,并将其本地化为单个线程。
简而言之,使用scoped_session()来保证线程安全。
答案 1 :(得分:9)
每个方法都有Scoped_session,因为它会为你提供一个你无法预先获得的本地会话线程(比如在模块级别)。不需要在每个方法中打开一个新会话,你可以使用全局会话,创建一个仅当全局会话不可用时才会话。即你可以编写一个方法来返回一个会话并将其添加到你的包中的 init .py。
答案 2 :(得分:1)
仅供参考,在使用flask-sqlalchemy时,默认情况下,提供的会话对象是作用域内的会话对象。
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