我正在开发一个使用sqlalchemy和异步and来处理postgres数据库的database服务器。对于每个请求,都会创建一个新会话(如文档中所示,通过快速a依赖注入)。我在sqlite+aiosqlite之前就使用了postgres+asyncpg,一切都很完美。在我从sqlite切换到postgres之后,每一个switched请求都会因错误而崩溃:
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
发布于 2022-08-25 10:25:50
将poolclass=NullPool添加到create_async_engine后,错误消失了,下面是引擎创建的样子:
from sqlalchemy.pool import NullPool
...
async_engine = create_async_engine(
db_async_url, future=True, echo=True, poolclass=NullPool
)
我花了一天多的时间来解决这个问题。我希望我的答案能为其他开发人员节省很多时间。也许还有其他解决办法,如果是的话,我将很高兴在这里看到它们。
https://stackoverflow.com/questions/73485899
复制相似问题