当前位置: 首页 > 知识库问答 >
问题:

python - Python 数据库插件 Sqlalchemy 为什么不能关闭连接?

阎单鹗
2024-01-24

为什么这段代码不会关闭数据库连接呢 SELECT * FROM information_schema.PROCESSLIST;

from sqlalchemy import create_engine, URL, delete, update, select, existsfrom sqlalchemy.orm import sessionmaker, scoped_sessionfrom core.database.base import Basefrom lib.type import Typefrom typing import Anyfrom flask import g, current_appimport importlibimport reclass Database:    ENV = None    def set(self, key: str, value: any):        """        @ 主要场景:令牌守卫设置[读取令牌下的]        """        if self.ENV == "Application":            g.Application = self.container._replace(**{key: value})        if self.ENV == 'Platform':            g.Platform = self.container._replace(**{key: value})    @property    def container(self):        if self.ENV == "Application":            if "Application" not in g:                g.Application = Type.Application(None, None, None)            return g.Application        if self.ENV == 'Platform':            if "Platform" not in g:                g.Platform = Type.Platform(None, None)            return g.Platform    @property    def database_conf(self):        """        @ [平台-数据库]:配置        """        return Base.setting(current_app.config["Database"])    @property    def __database_core(self):        return self.__create_session(**self.database_conf)    @property    def __create_engine(self):        """        @ 数据库引擎[缓存]:生成器        """        core = self.__database_core        self.set("engine", core.engine)        return core.engine    @property    def __create_database(self):        """        @ 数据库[缓存]:生成器        """        core = self.__database_core        self.set("database", core.session)        return core.session    def __create_session(self, **config):        """        @ 创建容器:节约开销        """        engine = self.create_engine(**config)        session = scoped_session(sessionmaker(bind=engine, autoflush=True))        return Type.Database(engine=engine, session=session())    @classmethod    def create_engine(cls, **kwargs):        """        @ 创建连接:引擎        """        return create_engine(URL.create("mysql+pymysql", **kwargs), echo=True, isolation_level="AUTOCOMMIT")    @staticmethod    def create_all(models: list, engine=None):        """        @ 创建模型:批量        """        tables = [Database.get_model(model).__table__ for model in models]        Base.metadata.create_all(bind=engine, tables=tables)    def create_table(self, tables: list):        Database.create_all(models=tables, engine=self.__create_engine)    @staticmethod    def get_model(model: str):        """        @ 获取模型:对象实例        """        module = importlib.import_module(f"model.{model.split('_')[0]}.{model}")        class_name = ''.join(re.findall(r"[a-zA-Z]+", model.split(".")[-1].title()))        return getattr(module, class_name)()    @property    def database(self):        """        @ 数据库[缓存]        """        return self.__create_database if getattr(self.container, "database") is None else self.container.database    def table_data_query_all(self, model: Any, condition: list = None, order: list = None, limit: int = 500,                             fields: list = None) -> list[dict]:        """        @ 查询:多条        """        query = select(model)        if fields is not None:            query = query.with_only_columns(*fields)        if condition is not None:            query = query.filter(*condition)        if order is not None:            query = query.order_by(*order)        asdasdas = [row.dict() for row in self.database.execute(query.limit(limit)).scalars()]        self.database.get_bind().dispose()        return asdasdas    def table_data_query_one(self, model: Any, condition: list = None) -> dict:        """        @ 查询:单条        """        result = self.database.execute(select(model).filter(*condition).limit(1)).scalar_one_or_none()        return None if result is None else result.dict()    def table_data_query_exists(self, condition: list) -> bool:        """        @ 查询:存在        """        return self.database.query(exists().where(*condition)).scalar()    def table_data_insert_all(self, models: list) -> None:        """        @ 批量新增        """        with self.database as db:            db.add_all(models)            db.commit()    def table_data_insert_one(self, model, data: bool = False) -> int | dict:        """        @ 单个新增:默认返回自增主键:可选返回整条数据        """        with self.database as db:            db.add(model)            db.commit()            return model.dict() if data is True else model.id    def table_data_update(self, model: Any, condition: list, data: dict) -> None:        """        @ 批量新增        """        with self.database as db:            db.execute(update(model).where(*condition).values(**data))    def table_data_delete(self, model: Any, condition: list) -> None:        """        @ 批量新增        """        with self.database as db:            db.execute(delete(model).where(*condition))    def close(self):        """        @ 关闭数据库连接        """        if self.database is not None:            self.database.close()

image.png

共有1个答案

狄灵均
2024-01-24

这是类定义,调用此类的地方,在最后,调用其def close(self) 方法。。。。。或者在Database类的析构函数调用close()方法

 类似资料:
  • 我正在尝试使用python和MySQL开发药房管理系统。但我在连接数据库时遇到了问题。 下面是一些代码:

  • 必须要指定字段名么?不能类似 PHP 那样写了 SQL 直接用么

  • 这完全没任何提示就失败了是为什么? 模型 实际情况:压根连 add 方法都没触发:(删除了部分非必要代码) 调试情况: 问题是为什么一定要赋值之后才能生效呢?方法不是已经返回了对象么?

  • 问题内容: 我正在做这样的事情… 自动提交更改。但是文档对关闭连接一无所知。 实际上,我可以在以后的语句(已测试)中使用。因此,似乎上下文管理器没有关闭连接。 我是否必须手动关闭连接。如果我打开它怎么办? 编辑 我的发现: 我已经测试并确认了上下文管理器中的 连接未关闭 。在之后,上下文管理器仅通过执行以下操作来提交更改: 并且相同,因此使用其中任何一个仍将保持连接活动 语句不会创建新的作用域,因

  • 我正在尝试使用python和MySQL开发药房管理系统。但我在连接数据库时遇到了问题。 下面是一些代码:

  • 问题内容: 通常,当我打开文件时,我从不调用该方法,也不会发生任何不良情况。但是有人告诉我这是不好的做法。这是为什么? 问题答案: 在大多数情况下,不关闭文件是一个坏主意,原因如下: 它会将您的程序放在垃圾收集器的手中-尽管 理论上 该文件将自动关闭,但可能不会关闭。Python 3和Cpython通常在垃圾收集方面做得相当不错,但并非总是如此,其他变体通常也很烂。 它可能会降低您的程序速度。打开