Python sqlalchemy中的作用域_会话(sessionmaker())还是普通sessionmaker()?

Python sqlalchemy中的作用域_会话(sessionmaker())还是普通sessionmaker()?,python,django,orm,sqlalchemy,flask-sqlalchemy,Python,Django,Orm,Sqlalchemy,Flask Sqlalchemy,我正在我的web项目中使用SQlAlchemy。我应该使用什么-scoped_session(sessionmaker())或普通的sessionmaker()-为什么?还是我应该用别的 ## model.py from sqlalchemy import * from sqlalchemy.orm import * engine = create_engine('mysql://dbUser:dbPassword@dbServer:dbPort/dbName', pool_recycle=3

我正在我的web项目中使用SQlAlchemy。我应该使用什么-
scoped_session(sessionmaker())
或普通的
sessionmaker()
-为什么?还是我应该用别的

## 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()
对象并关闭它。我做的是对的还是有更好的方法?

建议阅读:

提供了
scoped_session()
函数,该函数生成
session
对象的线程管理注册表。它通常用于web应用程序中,因此可以使用单个全局变量来安全地表示具有对象集的事务会话,这些对象集中在单个线程中


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

每个方法的scoped_session都会为您提供一个事先无法获得的本地会话线程(如在模块级别)。不需要在每个方法中打开新会话,您可以使用全局会话,仅当全局会话不可用时创建会话。i、 e您可以编写一个方法,返回会话并将其添加到包中的init.py

我自己也在研究,但我不是专家

我的三点意见是:

  • 根据Kluev先生的上述评论,SQLAlchemy文档提供了一种使用
    作用域_会话
    的建议方法,链接:
  • 在该web位置,SQLAlchemy文档还表示“…强烈建议使用web框架本身提供的集成工具(如果可用),而不是
    作用域\u会话
  • 例如,炼金术似乎声称它解决了以下问题:

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


    谢谢。对于每个请求,打开和关闭会话对象是否安全?@northlondoner,不仅是安全的,而且是推荐的操作方式,请参见@DanielKluev,这是一个很长的页面,自从你发表评论以来已经有一段时间了,所以可能我读错了,或者页面已经更改,但页面似乎在说相反的话。对我来说,“不要这样做”代码示例似乎与OP代码示例中使用的模式非常相似,在OP代码示例中,将为每个数据库请求创建一个新会话。这是一个混合的术语问题(网页请求与数据库请求),还是我缺少的两个片段之间有什么区别?@mmitchell到目前为止,文档可能更清晰:,并且仍然存在并且有效,以某种方式解释了它的工作原理,使用Flask SQLAlchemy的问题是它需要模型的db.Model基根。如果你的模型来自其他地方,而不是你的网络应用程序,那么你就不走运了。因此,需要有作用域的_session()。