Ошибка SQLAlchemy: InvalidRequestError — невозможно выполнить закрытую транзакцию внутри диспетчера контекстаPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Ошибка SQLAlchemy: InvalidRequestError — невозможно выполнить закрытую транзакцию внутри диспетчера контекста

Сообщение Anonymous »

Я столкнулся с проблемой при работе с SQLAlchemy в проекте FastAPI. Я настроил маршрут, который должен добавлять элементы в базу данных с помощью диспетчера контекста и вложенных транзакций. Если один элемент не удалось добавить (из-за ограничений или по какой-либо причине), его не следует включать в фиксацию. Однако остальные элементы, добавленные как до, так и после, должны быть включены.
При использовании вложенных транзакций я ожидаю, что смогу отслеживать неудачные и успешные добавления. Однако я продолжаю сталкиваться со следующей ошибкой:

Код: Выделить всё

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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»