我正在开发一个使用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
1条答案
按热度按时间9rbhqvlz1#
在create_async_engine中添加poolclass=NullPool后,错误消失了,下面是引擎创建的样子:
我花了一天多的时间来解决这个问题,我希望我的回答能为其他开发人员保存很多时间,也许还有其他的解决方案,如果有的话,我会很高兴在这里看到他们。