python - SQLAlchemy 事务未持久化
问题描述
我最近不得不在我的应用程序上实现一个事务,如下所示:
我有一个:
- “项目”表
- 具有“items.id”作为 ForeignKey 的“tags”表
- 具有“items.id”作为 ForeignKey 的“descriptions”表
如果失败,我现在想执行此事务或回滚:
- 将项目插入“项目”
- 刷新并获取 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 该项目没有持久化,也没有标签或描述。我做错了什么,因为我没有错误。
如果需要我的更多代码,请告诉我,我使用带有 SQLAlchemy 的 FastAPI 框架。
解决方案
我设法让它自己工作。原来 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()
推荐阅读
- monaco-editor - DiagnosticsOptions typescript 怎么用?
- javascript - Discord 事件处理程序错误,我不知道为什么
- python - 将方法动态添加到python中的类_without_暴露方法
- javascript - 无法在 Mysql 表的 ID 列中设置自定义值
- hibernate - 查询中的休眠表未映射错误
- zig - 具有多个 exe 和库的 zig 项目
- python - ast - 仅获取表达式中变量名的列表
- python - 使用 eval 将过滤器应用于数据框(类字典)
- python - SecureAuth 原因 - ShareplumRequestError: Shareplum HTTP Post Failed : 403 Client Error: Forbidden for url
- c - 哪些部分存储在 CPU 缓存中(缓存设计和替换算法)