При использовании вложенных транзакций я ожидаю, что смогу отслеживать неудачные и успешные добавления. Однако я продолжаю сталкиваться со следующей ошибкой:
Код: Выделить всё
sqlalchemy.exc.InvalidRequestError: Can't operate on a closed transaction inside a context manager.
Код: Выделить всё
router = APIRouter()
@lru_cache()
def get_session_maker() -> sessionmaker:
# create a reusable factory for new AsyncSession instances
engine = create_engine(SQLALCHEMY_DATABASE_URI, echo=True)
return sessionmaker(engine)
def get_session() -> Generator[Session, None, None]:
cached_sessionmaker = get_session_maker()
with cached_sessionmaker.begin() as session:
yield session
@router.post("/items")
def add_items(
session: Session = Depends(get_database.get_session),
) -> Dict[str, Any]:
request_inputs = [
RequestInput(name="chair", used_for="sitting"),
RequestInput(name="table", used_for="dining"),
RequestInput(name="tv", used_for="watching"),
]
uploaded_items = []
failed_items = []
for request_input in request_inputs:
try:
with session.begin_nested():
item= Item(
**request_input.dict()
)
session.add(item)
session.refresh(item)
uploaded_items += 1
except IntegrityError as e:
# Handle any integrity constraint violations here
session.rollback()
failed_items += 1
except Exception as e:
# Handle other exceptions
session.rollback()
failed_items += 1
session.commit()
return {
"uploaded": uploaded_items,
"failed": failed_items,
}
Заранее благодарю за помощь.
Я пытался использовать session.begin_nested() для отслеживания статуса моей транзакции, однако, похоже, она где-то закрывается. если не использовать Begin_nested(), я фиксирую только элементы до неудачного экземпляра. Все последующие элементы исключаются.
Подробнее здесь: https://stackoverflow.com/questions/773 ... ction-insi