python 带有asyncpg的SQLAlchemy崩溃,错误为:asyncpg.InterfaceError -无法执行操作:另一个操作正在进行中

t40tm48m  于 2022-12-28  发布在  Python
关注(0)|答案(1)|浏览(246)

我正在开发一个使用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
9rbhqvlz

9rbhqvlz1#

在create_async_engine中添加poolclass=NullPool后,错误消失了,下面是引擎创建的样子:

from sqlalchemy.pool import NullPool

...

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

我花了一天多的时间来解决这个问题,我希望我的回答能为其他开发人员保存很多时间,也许还有其他的解决方案,如果有的话,我会很高兴在这里看到他们。

相关问题