Транзакция SQLAlchemy не сохраняется - PullRequest
1 голос
/ 05 августа 2020

Недавно мне пришлось реализовать транзакцию в моем приложении, которая выглядит следующим образом:

У меня есть:

  • таблица элементов
  • «теги» таблица, которая имеет "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.

1 Ответ

1 голос
/ 05 августа 2020

Мне удалось заставить его работать сам. Оказывается, db.begin (subtransactions = True) на самом деле не нужен.

это моя грязная забава c сейчас, и он делает то, что мне нужно:

# create item as transaction
def create_item_v2(db: Session, item: items_schemas.ItemCreateV2):
    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)

    try:
        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.refresh(db_item)
        return db_item
    except:
        db.rollback()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...