MST
星途 面试题库

面试题:Python使用SQLAlchemy实现复杂查询及事务处理

在Python项目中,使用SQLAlchemy库连接MySQL数据库。假设有两张表,一张为students(id, name, class_id),另一张为classes(id, class_name)。请编写代码实现查询某个班级(例如'class_name'为'一班')所有学生的信息,并将对学生信息的修改操作放入一个事务中,确保操作的原子性,同时处理可能出现的数据库相关异常。
49.1万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

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

# 数据库连接配置
engine = create_engine('mysql+pymysql://username:password@host:port/database_name')
Session = sessionmaker(bind=engine)
session = Session()
Base = declarative_base()


# 定义班级表
class Classes(Base):
    __tablename__ = 'classes'
    id = Column(Integer, primary_key=True)
    class_name = Column(String(50))
    students = relationship('Students', backref='classes')


# 定义学生表
class Students(Base):
    __tablename__ ='students'
    id = Column(Integer, primary_key=True)
    name = Column(String(50))
    class_id = Column(Integer, ForeignKey('classes.id'))


try:
    # 查询'一班'所有学生的信息
    target_class = session.query(Classes).filter(Classes.class_name == '一班').first()
    if target_class:
        students = target_class.students
        for student in students:
            print(f"学生ID: {student.id}, 学生姓名: {student.name}")

            # 这里开始模拟对学生信息的修改操作,放入事务中
            try:
                session.begin()
                student.name = "新名字"  # 模拟修改学生姓名
                session.commit()
            except Exception as e:
                session.rollback()
                print(f"修改学生 {student.name} 信息时出错: {e}")
                traceback.print_exc()

except Exception as e:
    print(f"数据库操作出现异常: {e}")
    traceback.print_exc()
finally:
    session.close()

请将代码中的usernamepasswordhostportdatabase_name替换为实际的MySQL数据库连接信息。此代码实现了查询指定班级的学生信息,并将对学生信息的修改操作放入事务中,同时处理了可能出现的数据库异常。