吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 163|回复: 1
收起左侧

[经验求助] python的sqlalchemy库不理解的报错

[复制链接]
嗯,是我he 发表于 2024-11-8 02:47
25吾爱币
我想问一下关于python的sqlalchemy库的问题,我在用这个库的异步+连接池管理MySQL,正常来说连接会自动管理的,无需手动的断开连接。问题是:如果我没有手动断开连接,那么终端就会弹出一大堆连接错误的提示,因为连接被自动管理断开了(但这并没有影响程序的功能,程序的目的已经完成了)。
疑惑:我现在可以通过添加“手动的关闭连接”阻止报错的发生,但这样的话就会失去“自动管理连接池”的意义。因为第一次遇见这种问题,所以请教一下大家的建议。
以下是报错提示————
True
Exception ignored in: <function Connection.__del__ at 0x0000024CDD01E980>
Traceback (most recent call last):
  File "d:\Uers\创作\Ea\twoxyz\.venv\Lib\site-packages\aiomysql\connection.py", line 1131, in __del__
    self.close()
  File "d:\Uers\创作\Ea\twoxyz\.venv\Lib\site-packages\aiomysql\connection.py", line 339, in close
    self._writer.transport.close()
  File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.12_3.12.240.0_x64__qbz5n2kfra8p0\Lib\asyncio\proactor_events.py", line 109, in close
    self._loop.call_soon(self._call_connection_lost, None)
  File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.12_3.12.240.0_x64__qbz5n2kfra8p0\Lib\asyncio\base_events.py", line 772, in call_soon
    self._check_closed()
  File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.12_3.12.240.0_x64__qbz5n2kfra8p0\Lib\asyncio\base_events.py", line 519, in _check_closed
    raise RuntimeError('Event loop is closed')
RuntimeError: Event loop is closed


这是我写的代码————
[Python] 纯文本查看 复制代码
import asynciofrom sqlalchemy.ext.asyncio import create_async_engine, AsyncSession
from sqlalchemy.orm import sessionmaker
from sqlalchemy import exists, select
from orm_module import QR_HTML_AccessLogs

DATABASE_URL = "mysql+aiomysql://********************************************************"

# 创建异步引擎
async_engine = create_async_engine(
    DATABASE_URL,
    echo=False,
)

# 定义异步数据库连接类
class AsyncDatabaseConnection:

    def __init__(self):
        # 创建异步会话工厂
        self.AsyncSessionFactory = sessionmaker(
            bind=async_engine,
            class_=AsyncSession,
            expire_on_commit=False
        )

    # 查询数据是否存在(返回布尔值)——异步
    async def query_single_code(self, data_code):
        async with self.AsyncSessionFactory() as db:
            # 构建查询
            exists_query = await db.execute(select(exists().where(QR_HTML_AccessLogs.code == data_code)))
            return exists_query.scalar()

if __name__ == "__main__":
    db_connection = AsyncDatabaseConnection()
    # 查询单个key是否存在
    bb = asyncio.run(db_connection.query_single_code("151515"))
    print(bb)  # 应该输出 True 或 False

最佳答案

查看完整内容

根据你提供的报错信息,错误发生在数据库连接对象被销毁时。 async_engine 本身并不是连接池,而是配置和管理数据库连接的引擎。实际的连接池管理是由你的 AsyncSessionFactory 控制的。通过 AsyncSessionFactory 构造的 Session 是可以自动管理生命周期的,也就是连接池是被正确自动管理的;而 async_engine 不在连接池的管理范围,它是用于与数据库交互的根本连接。

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

NCBM 发表于 2024-11-8 02:47
根据你提供的报错信息,错误发生在数据库连接对象被销毁时。
async_engine 本身并不是连接池,而是配置和管理数据库连接的引擎。实际的连接池管理是由你的 AsyncSessionFactory 控制的。通过 AsyncSessionFactory 构造的 Session 是可以自动管理生命周期的,也就是连接池是被正确自动管理的;而 async_engine 不在连接池的管理范围,它是用于与数据库交互的根本连接。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 15:21

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表