python - Flask/SQLAlchemy - 无法在应用程序工厂中删除 Session 对象
问题描述
正如 SQLAlchemy 文档所建议的那样,我正在尝试在请求拆卸时删除 scoped_session 对象,但要么我误解了这个过程(可能),要么我做错了什么并且它不能正常工作(很有可能)。
我正在制作蓝图,这是我初始化数据库连接的方式:
# this is db.py
import os
import urllib
import pyodbc
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker, exc
from config import Config as app_config
from .models import Base
# Turn off pyodbc pooling
pyodbc.pooling = False
# TODO: put these into ENV variables
connection_params = {
# params here
}
db_params = urllib.parse.quote_plus(("DRIVER={driver};SERVER={server};PORT=1433;DATABASE={database};UID={username};PWD={password};TDS_Version=7.2;").format(**connection_params))
connection_string = "mssql+pyodbc:///?odbc_connect=%s" % db_params
engine = create_engine(
connection_string, connect_args={"check_same_thread": False}
)
Base.prepare(engine, reflect=True)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
# this is application.py
from flask import Flask, _app_ctx_stack
from sqlalchemy.orm import scoped_session
from config import Config
from .db import SessionLocal
def create_app(config_class=Config):
app = Flask(__name__, instance_relative_config=False)
app.config.from_object(config_class)
# Database init
app.session = scoped_session(SessionLocal, scopefunc=_app_ctx_stack.__ident_func__)
with app.app_context():
from application.errors import errors_bp
app.register_blueprint(errors_bp)
from application.main import main_bp
app.register_blueprint(main_bp)
return app
这就是我在主蓝图的 routes.py 文件中拆除请求的方式:
@main_bp.teardown_request
def remove_session(*args, **kwargs):
current_app.session.remove()
我想如果我执行 session.remove() 会释放池中的连接,但我仍然看到一个连接在数据库中休眠。如果我在 .remove() 之前和之后打印出会话,我也会得到相同的内存地址
teardown - session before remove
<sqlalchemy.orm.scoping.scoped_session object at 0x75b11610>
teardown - session After remove
<sqlalchemy.orm.scoping.scoped_session object at 0x75b11610>
如何检查会话是否已正确删除?
我知道上面的很多内容都达不到标准,我正在学习,所以我很感激关于如何做得更好的笔记。
解决方案
推荐阅读
- c++ - qt3d窗口内的Qt小部件
- dask - 最后冻结的两个 Dask 数组的计算
- java - ProcessBuilder 在包含本地环境变量的命令上失败
- c# - 当另一个列表被清除时,参考列表会受到影响
- r - 字符串到 int/float,很多多列 - R
- node.js - Passport.js 注销会话销毁适用于 POSTMAN,但不适用于 React 应用程序。如何解决这个问题
- excel - 读取特定字符串的文本文件,如果找不到则打开 msgbox
- javascript - 字符串化时的 ArrayBuffer 变为空对象
- vuejs2 - Nuxt - _nuxt 文件夹未提供自定义图标字体
- python - Pycharm在运行脚本时重用上次打开的控制台