SQLAlchemy事件循环已关闭。

3
我正在使用SQLAlchemy ORM功能进行实验。
我能够在我的主应用程序上使其工作,但是当我创建一个单独的文件test.py进行测试时,我一直得到事件循环关闭错误:
Exception ignored in: <function Connection.__del__ at 0x7f7041c07310>
Traceback (most recent call last):
  File "/home/krypt/Documents/Projects/app/env/lib/python3.9/site-packages/aiomysql/connection.py", line 1072, in __del__
  File "/home/krypt/Documents/Projects/app/env/lib/python3.9/site-packages/aiomysql/connection.py", line 298, in close
  File "/usr/lib/python3.9/asyncio/selector_events.py", line 700, in close
  File "/usr/lib/python3.9/asyncio/base_events.py", line 746, in call_soon
  File "/usr/lib/python3.9/asyncio/base_events.py", line 510, in _check_closed
RuntimeError: Event loop is closed

这是关于test.py的代码:

from sqlalchemy.ext.asyncio import create_async_engine
from sqlalchemy.orm import declarative_base
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy import Table, Column, Integer, String
from sqlalchemy.future import select
from sqlalchemy import delete
import asyncio

Base = declarative_base()

class Table(Base):
    __tablename__ = 'Table'

    id = Column(Integer, primary_key=True)
    string = Column(String(30))
    prefix = Column(String(1), default = "!")




async def main():
    engine = create_async_engine("mariadb+aiomysql://user:password@127.0.0.1:3306/dbname")
    session = AsyncSession(engine)

    stmt = select(Table).where(Table.prefix == "!")

    res = await session.execute(stmt)
    row = res.scalars().first()

    print(row)

asyncio.run(main())

1个回答

5
问题似乎是aiomysql在事件循环关闭后尝试关闭其连接。我可以通过确保会话关闭和引擎处理来使问题代码正常工作。
async def main():
    engine = create_async_engine("mariadb+aiomysql://user:password@127.0.0.1:3306/dbname")
    async with AsyncSession(engine) as session:

        stmt = select(Table).where(Table.prefix == "!")

        res = await session.execute(stmt)
        row = res.scalars().first()

        print(row)
    await engine.dispose()

这里有一些讨论关于这个链接(建议阅读文章结尾部分); 明确关闭和处理是推荐的解决方法,以防止连接的__del__方法在事件循环关闭后执行。


啊,我明白了。我正在运行一个连续的循环,用于实例化在后续代码中要使用的会话(用于 Discord 机器人)。 当主事件循环结束时,我想使用 discord.py 的 client.run 方法来启动我的 Discord 机器人,但实际上我无法在已经运行的事件循环中运行它。 你有什么解决办法吗? - undefined
1
恐怕不行 - 我很少使用异步操作,而且完全不用discord。我认为你应该提出一个新问题,解释一下你想要做什么。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接