SQLAlchemy 与 asyncpg 崩溃并出现错误:asyncpg.InterfaceError - 无法执行操作:另一个操作正在进行中

2023-11-30

我正在使用 sqlalchemy 和 asyncpg 开发一个 fastapi 服务器来处理 postgres 数据库。对于每个请求,都会创建一个新会话(通过 fastapi 依赖项注入,如文档中所示)。我在 postgres+asyncpg 之前使用了 sqlite+aiosqlite,一切都运行良好。当我从 sqlite 切换到 postgres 后,每个 fastapi 请求都会崩溃并出现以下错误:

sqlalchemy.dialects.postgresql.asyncpg.InterfaceError - cannot perform operation: another operation is in progress

这就是我创建引擎和会话的方式:

from typing import Generator
import os

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker, Session
from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine


user = os.getenv('PG_USER')
password = os.getenv('PG_PASSWORD')
domain = os.getenv('PG_DOMAIN')
db = os.getenv('PG_DATABASE')

# db_async_url = f'sqlite+aiosqlite:///database.sqlite3'
db_async_url = f'postgresql+asyncpg://{user}:{password}@{domain}/{db}'

async_engine = create_async_engine(
    db_async_url, future=True, echo=True
)

create_async_session = sessionmaker(
    async_engine, class_=AsyncSession, expire_on_commit=False
)

async def get_async_session() -> Generator[AsyncSession]:
    async with create_async_session() as session:
        yield session

将 poolclass=NullPool 添加到 create_async_engine 后,错误消失了,所以引擎创建现在如下所示:

from sqlalchemy.pool import NullPool

...

async_engine = create_async_engine(
    db_async_url, future=True, echo=True, poolclass=NullPool
)

我花了一天多的时间才解决这个问题。我希望我的回答能为其他开发人员节省大量时间。也许还有其他解决方案,如果是这样,我会很高兴在这里看到它们。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQLAlchemy 与 asyncpg 崩溃并出现错误:asyncpg.InterfaceError - 无法执行操作:另一个操作正在进行中 的相关文章

随机推荐