![](/img/trans.png)
[英]SQLAlchemy with asyncpg cannot perform operation: another operation is in progress
[英]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.