Python SQLAlchemy事务未持久化

Python SQLAlchemy事务未持久化,python,sqlalchemy,fastapi,Python,Sqlalchemy,Fastapi,我最近不得不在我的应用程序上实现一个事务,如下所示: 我有一个: “项目”表 “tags”表,其中“items.id”作为外键 “descriptions”表,其中“items.id”作为外键 我现在想执行此事务,如果失败则回滚: 在“项目”中插入项目 刷新并获取item.id(主键) 将标签插入“标签”(使用item.id),这是标签列表 将说明插入“说明”(使用item.id),这是说明列表 我的数据库是sqlite 我的代码: db_item = models.Items(titl

我最近不得不在我的应用程序上实现一个事务,如下所示:

我有一个:

  • “项目”表
  • “tags”表,其中“items.id”作为外键
  • “descriptions”表,其中“items.id”作为外键
我现在想执行此事务,如果失败则回滚:

  • 在“项目”中插入项目
  • 刷新并获取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,它将返回它的id,但是如果我检查db,则该项没有被持久化,也没有标记或描述。当我没有犯错时,我做错了什么


如果需要更多的代码,请告诉我,我使用FastAPI框架和SQLAlchemy。

我自己设法让它工作。 事实证明,实际上并不需要db.begin(subtransactions=True)

这是我现在的crud func,它满足我的需要:

# 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()