【发布时间】:2021-02-04 13:38:17
【问题描述】:
由于模型定义和在 Flask 之外的其他上下文中使用应用程序的数据库部分,我无法使用 Flask-SQLAlchemy,因此我找到了几种管理会话的方法,但我不知道该怎么做。
似乎每个人(包括我)都同意的一件事是,应该在每个请求开始时创建一个新会话,并在处理请求并且准备好将响应发送回客户。
目前,我以这种方式实现了会话管理:
我有一个数据库初始化 python 脚本,它创建引擎 (engine = create_engine(app.config["MYSQL_DATABASE_URI"])) 并定义会话创建者 Session = sessionmaker(bind=engine, expire_on_commit=False)。
在另一个文件中,我定义了两个用flask 的before_request 和teardown_request 应用程序装饰器装饰的函数。
@app.before_request
def create_db_session():
g.db_session = Session()
@app.teardown_request
def close_db_session(exception):
try:
g.db_session.commit()
except:
g.db_session.rollback()
finally:
g.db_session.close()
然后我在需要执行查询时使用g.db_session:g.db_session.query(models.User.user_id).filter_by(username=username)
这是管理会话的正确方法吗?
我还查看了 SQLAlchemy 提出的scoped sessions,这可能是另一种做事方式,但我不确定如何更改我的系统以使用范围会话...
如果我理解得很好,我不会使用g 变量,而是总是引用Session = scoped_session(sessionmaker(bind=engine, expire_on_commit=False)) 声明的Session 定义,并且我不需要在请求到达时显式初始化新会话。
我可以像往常一样使用Session.query(models.User.user_id).filter_by(username=username) 执行我的查询,我只需要在请求结束时删除会话:
@app.teardown_request
def close_db_session(exception):
Session.commit()
Session.remove()
我对这个会话管理主题有点迷茫,我需要帮助来了解如何管理会话。上述两种方法有真正的区别吗?
【问题讨论】:
标签: python flask sqlalchemy