사이드 프로젝트에서 FastAPI와 SQLAlchemy async session을 사용 중입니다. 외부 API 호출 후 DB 업데이트 로직에서 에러가 납니다.
코드:
import asyncio
from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession
from sqlalchemy.orm import sessionmaker
engine = create_async_engine("postgresql+asyncpg://user:pass@localhost/db")
AsyncSessionLocal = sessionmaker(engine, class_=AsyncSession, expire_on_commit=False)
async def update_data(session, data):
await session.execute("UPDATE users SET name=:name WHERE id=1", {"name": data})
await session.commit()
async def main():
async with AsyncSessionLocal() as session:
# 외부 API 모킹
await asyncio.sleep(1)
await update_data(session, "test_name")
asyncio.run(main())
오류: RuntimeError: Task <Task pending> attached to a different loop
시도: asyncio.run() 대신 loop.run_until_complete() 사용, 세션 생성 위치 변경.
질문: 비동기 세션을 외부 함수로 넘길 때 이벤트 루프가 꼬이는 건지, 어떻게 해결해야 합니까?
댓글5
-
빗방울
2026.10.30 10:45
-
빗방울
2026.10.30 12:17
맞아요 엔진을 루프 안에서 만들어야 안전하긴 하더라고요ㅋㅋ 그렇게 해도 안 되면 세션 팩토리 쪽 다시 보셔야 할 듯요ㄷㄷ
-
빗방울
2026.10.30 11:07
혹시 세션 생성할 때 루프 명시적으로 안 잡으신 거 아님?
제 생각엔 asyncpg 쪽 연결 풀 설정 확인해보면 나올 것 같네요.
비동기 DB는 진짜 루프 하나만 튀어도 답 없던데 고생하시네요ㅋㅋ
-
빗방울
2026.10.30 11:37
이거 혹시 세션 넘길 때 말고 컨텍스트 매니저 범위 밖에서 세션 쓰신 건 아니죠? 제 생각엔 세션 라이프사이클이 꼬인 것 같은데 한번 확인해보세요ㅋㅋ
-
빗방울
2026.10.30 16:29
맞아요 저도 예전에 범위 밖에서 쓰다가 멘붕 왔었는데ㅋㅋ 라이프사이클 꼬이면 진짜 잡기 힘들더라고요ㄷㄷ
모든 이야기1478
가벼운 안부부터 깊은 생각까지, 함께 나눠요.
총 1478개의 이야기
이거 루프 꼬이면 진짜 답 없던데ㅋㅋ
제 생각엔 엔진 생성 위치를 main 함수 안으로 옮겨서 루프 맞추면 해결될 것 같아요.