nor*_*ner 30 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()
Run Code Online (Sandbox Code Playgroud)
我为每个请求创建一个session = Session()对象,然后关闭它.我做对了还是有更好的方法吗?
tuo*_*mur 30
建议阅读文档:
提供了scoped_session()函数,该函数生成一个Session对象的线程管理注册表.它通常用于Web应用程序,因此可以使用单个全局变量来安全地表示具有对象集的事务会话,这些对象集中在单个线程中.
简而言之,使用scoped_session()来保证线程安全.
Bas*_*usa 11
不要使用scoped_session,也不要使用Flask-SQLAlchemy。
\n只需Session = sessionmaker()在单例/服务类中使用,并session = Session()在每个 HTTP 请求上使用即可保证提供新的连接。
线程本地存储很笨拙,并且涉及保持状态,这与不同的 Web 服务器线程模型不能很好地配合。最好保持无国籍状态。例如,请参阅 SqlAlchemy\'s 文档,其中提到.remove()如果您正在使用scoped_session. 有人会记得这样做吗?
\n\n使用上述流程,将 Session 与 Web 应用程序集成的过程恰好有两个要求:
\n\n
\n- \n
当 Web 应用程序首次启动时创建一个
\nscoped_session注册表,确保应用程序的其余部分可以访问该对象。- \n
确保
\nscoped_session.remove()在 Web 请求结束时调用,通常通过与 Web 框架\xe2\x80\x99s 事件系统集成来建立 \xe2\x80\x9con 请求结束\xe2\x80\x9d 事件。
Scoped_session在每个方法中都会为你提供一个你无法事先获得的本地会话线程(比如在模块级别).不需要在每个方法中打开一个新会话,你可以使用全局会话,仅在创建会话时全局会话不可用.即你可以编写一个返回会话的方法,并将其添加到包内的init .py中.
| 归档时间: |
|
| 查看次数: |
21059 次 |
| 最近记录: |