Недавно мне пришлось реализовать транзакцию в моем приложении, которая выглядит следующим образом:
У меня есть:
- таблица элементов
- «теги» таблица, которая имеет "items.id" в качестве ForeignKey
- Таблица "descriptions", в которой "items.id" используется в качестве ForeignKey
Теперь я хочу выполнить эту транзакцию или выполнить откат в случае сбоя :
- вставить элемент в «элементы»
- flu sh и получить item.id (первичный ключ)
- вставить тег в «теги» (используя item.id), это список тегов
- вставить описание в «описания» (используя item.id), это список описаний
Моя база данных - sqlite .
мой код:
db_item = models.Items(title=item.title, description=item.description,
quantity=item.quantity, images=item.images,
category_name=item.category_name, status=item.status,
organization_id=item.organization_id, price=item.price)
db.begin(subtransactions=True)
db.add(db_item)
db.flush()
db_tags_to_items = [models.ItemsAndTags(tag_name=tag, item_id=db_item.id) for tag in item.tags]
db_short_descriptions = [models.ItemsShortDescription(line=line, item_id=db_item.id) for line in item.descriptions]
db.add_all(db_tags_to_items)
db.add_all(db_short_descriptions)
db.commit()
Если я верну db_item, он вернет его с идентификатором, однако, если я проверяю базу данных, этот элемент не был сохранен, ни теги, ни описания. Что я делаю неправильно, так как я не получаю ошибки.
Если требуется больше моего кода, дайте мне знать, я использую структуру FastAPI с SQLAlchemy.