首页 > 解决方案 > 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>

如何检查会话是否已正确删除?

我知道上面的很多内容都达不到标准,我正在学习,所以我很感激关于如何做得更好的笔记。

标签: pythonflasksqlalchemy

解决方案


推荐阅读