Python基础入门 Day62:SQLModel中的事务管理

29次阅读
没有评论

共计 1445 个字符,预计需要花费 4 分钟才能阅读完成。

在实际的业务开发中,数据库操作往往并不是单一的插入或更新,而是多个操作组合在一起形成一个整体。这时候如果其中某一步失败,就可能导致数据不一致。为了解决这个问题,就需要使用事务管理。SQLModel 基于 SQLAlchemy,可以方便地支持事务。

一、事务的基本概念

事务是一组数据库操作,要么全部成功提交,要么全部失败回滚。事务的四大特性简称为 ACID:

  1. 原子性(Atomicity):事务中的操作不可分割,要么全部完成,要么全部不做。
  2. 一致性(Consistency):事务执行前后,数据库必须保持一致状态。
  3. 隔离性(Isolation):多个事务之间互不干扰。
  4. 持久性(Durability):事务提交后,其结果会永久保存。

二、SQLModel 中的事务用法

使用 Session 对象时,可以通过 commit() 提交事务,或者通过 rollback() 回滚事务。例如:

from sqlmodel import Session
from models import User, engine

with Session(engine) as session:
    try:
        user1 = User(name="Alice", email="[email protected]")
        user2 = User(name="Bob", email="[email protected]")
        
        session.add(user1)
        session.add(user2)
        
        # 提交事务
        session.commit()
    except Exception as e:
        # 发生异常时回滚
        session.rollback()
        print(" 事务失败,已回滚:", e)

三、使用 begin() 自动管理事务

SQLModel 还支持 session.begin(),在 with 语句中会自动提交或回滚事务:

with Session(engine) as session:
    with session.begin():
        user1 = User(name="Charlie", email="[email protected]")
        user2 = User(name="David", email="[email protected]")
        session.add(user1)
        session.add(user2)

这里,如果在 with 代码块中出现异常,事务会自动回滚;如果执行正常结束,则会自动提交。

四、多个操作组合的事务

在实际开发中,可能需要同时修改多个表。例如:用户下单时,需要写入订单表,同时减少库存表中的数量:

with Session(engine) as session:
    try:
        with session.begin():
            order = Order(user_id=1, product_id=100, quantity=2)
            session.add(order)

            product = session.get(Product, 100)
            product.stock -= 2
            session.add(product)
    except Exception as e:
        print(" 下单失败,事务已回滚:", e)

如果库存不足或写入订单失败,整个事务会回滚,保证了订单和库存的一致性。

五、小结

事务管理是数据库编程中的核心知识点,能有效保证数据的可靠性和一致性。SQLModel 提供了灵活的事务机制,包括手动提交 / 回滚和自动事务控制。在开发中,应当根据场景合理选择事务模式,避免出现“部分成功”的问题。

下一节我们将学习 SQLModel 中的关系映射,深入掌握一对多和多对多的数据建模方法。

正文完
 0
评论(没有评论)