繁体   English   中英

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

[英]SQLAlchemy with asyncpg crashing with error: asyncpg.InterfaceError - cannot perform operation: another operation is in progress

我正在使用 sqlalchemy 和 asyncpg 开发一个 fastapi 服务器来处理 postgres 数据库。 对于每个请求,都会创建一个新的 session(通过 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
)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM