嗯,是我he 发表于 2024-11-8 02:47

python的sqlalchemy库不理解的报错

我想问一下关于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


这是我写的代码————
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

NCBM 发表于 2024-11-8 02:47

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