MST
星途 面试题库

面试题:Python中SQLAlchemy连接MySQL数据库的事务处理

在Python使用SQLAlchemy连接MySQL数据库场景下,假设要执行两个数据库操作:插入一条用户数据和更新该用户的某个字段。请用代码实现如何确保这两个操作要么都成功,要么都失败(即事务处理),并说明关键步骤的作用。
23.7万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base

# 创建数据库引擎
engine = create_engine('mysql+pymysql://username:password@host:port/database_name')
# 创建会话工厂
Session = sessionmaker(bind=engine)
# 创建基类
Base = declarative_base()

# 定义用户表模型
class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    name = Column(String(50))
    email = Column(String(100))

# 创建表(如果不存在)
Base.metadata.create_all(engine)

# 获取会话
session = Session()

try:
    # 插入一条用户数据
    new_user = User(name='John', email='john@example.com')
    session.add(new_user)

    # 更新该用户的某个字段
    new_user.name = 'Jane'

    # 提交事务
    session.commit()
    print("两个操作都成功")
except Exception as e:
    # 发生异常,回滚事务
    session.rollback()
    print(f"操作失败,原因: {e}")
finally:
    # 关闭会话
    session.close()

关键步骤作用:

  1. 创建数据库引擎create_engine 创建了与MySQL数据库的连接,指定了数据库的类型、用户名、密码、主机、端口和数据库名。
  2. 创建会话工厂和基类sessionmaker 创建了一个会话工厂,用于生成数据库会话。declarative_base 创建了一个基类,用于定义数据库表模型。
  3. 定义用户表模型:通过继承Base类,定义了User表的结构,包括idnameemail字段。
  4. 创建表Base.metadata.create_all(engine) 根据定义的模型创建数据库表(如果不存在)。
  5. 获取会话Session() 从会话工厂获取一个会话,用于执行数据库操作。
  6. 事务处理
    • 操作执行:在try块中执行插入和更新操作,这些操作在同一个事务中。
    • 提交事务session.commit() 将事务中的所有操作持久化到数据库。只有当此语句执行成功,所有操作才会生效。
    • 异常处理:如果在try块中发生异常,except块捕获异常并执行session.rollback(),撤销事务中的所有操作,确保数据的一致性。
  7. 关闭会话:无论事务是否成功,finally块中的session.close() 关闭会话,释放资源。