首页 > 解决方案 > 异步 SQLAlchemy:sqlalchemy.exc.InvalidRequestError:此会话处于“准备”状态;此事务中不能发出更多 SQL

问题描述

我目前正在使用带有异步方法并在asyncio事件循环中运行的类的异步 SQLAlchemy。

from asyncio.tasks import current_task
from sqlalchemy import update as select
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.asyncio import AsyncSession

engine = create_async_engine(url)
async_session_factory = sessionmaker(engine, expire_on_commit=False, class_=AsyncSession)
AsyncSession = scoped_session(async_session_factory, scopefunc=current_task)

class Animals:
    def __init__(self):
        self.connection = None

    async def connect(self):
        self.connection = AsyncSession()

    async def add():
        query = select(Animals.nicknames)
        self.connection.add(query)
        self.connection.commit()

    async def get():
        query = select(Animals.nicknames)
        rows = await self.connection.execute(query)
        for row in rows:
            print(row[0])

我的课需要有

self.connection = AsyncSession()

因为使用此类的应用程序将调用Animals.connection.close()关闭。

偶尔会出现错误信息:

sqlalchemy.exc.InvalidRequestError:此会话处于“准备”状态;在此事务中不能发出更多 SQL。

并且

sqlalchemy.dialects.postgresql.asyncpg.AsyncAdapt_asyncpg_dbapi.InterfaceError:<class 'asyncpg.exceptions._base.InterfaceError'>:无法执行操作:另一个操作正在进行中

是否可以在不修改使用此类的外部应用程序的情况下避免此错误?

标签: pythonpython-3.xasynchronoussqlalchemypython-asyncio

解决方案


推荐阅读