找回密码
 立即注册
首页 业界区 安全 sqlalchemy级联一记

sqlalchemy级联一记

计海龄 2025-6-1 18:21:10
下面详细介绍 SQLAlchemy 里单对单级联、单对多级联和多对多级联的实现,以及对应的 CRUD 操作,同时给出完整的代码示例。
单对单级联

实现思路

单对单关系意味着一个父对象只关联一个子对象,子对象也只关联一个父对象。可以通过设置 relationship 中的 uselist=False 来表示单对单关系,并且使用 cascade 参数实现级联操作。
代码示例
  1. from sqlalchemy import create_engine, Column, Integer, String, ForeignKey
  2. from sqlalchemy.orm import sessionmaker, relationship
  3. from sqlalchemy.ext.declarative import declarative_base
  4. # 创建基类
  5. Base = declarative_base()
  6. # 定义单对单关系的模型
  7. class Parent(Base):
  8.     __tablename__ = 'parent'
  9.     id = Column(Integer, primary_key=True)
  10.     name = Column(String)
  11.     # 单对单关系,设置级联操作
  12.     child = relationship("Child", back_populates="parent", uselist=False, cascade="all, delete-orphan")
  13. class Child(Base):
  14.     __tablename__ = 'child'
  15.     id = Column(Integer, primary_key=True)
  16.     name = Column(String)
  17.     parent_id = Column(Integer, ForeignKey('parent.id'))
  18.     parent = relationship("Parent", back_populates="child")
  19. # 创建数据库引擎
  20. engine = create_engine('sqlite:///test.db')
  21. # 创建表
  22. Base.metadata.create_all(engine)
  23. # 创建会话
  24. Session = sessionmaker(bind=engine)
  25. session = Session()
  26. # 创建操作
  27. def create_one_to_one():
  28.     parent = Parent(name='Parent')
  29.     child = Child(name='Child')
  30.     parent.child = child
  31.     session.add(parent)
  32.     session.commit()
  33.     return parent
  34. # 读取操作
  35. def read_one_to_one():
  36.     parent = session.query(Parent).first()
  37.     if parent:
  38.         print(f"Parent: {parent.name}, Child: {parent.child.name if parent.child else 'No child'}")
  39.     return parent
  40. # 更新操作
  41. def update_one_to_one():
  42.     parent = session.query(Parent).first()
  43.     if parent:
  44.         parent.name = 'Updated Parent'
  45.         if parent.child:
  46.             parent.child.name = 'Updated Child'
  47.         session.commit()
  48.     return parent
  49. # 删除操作
  50. def delete_one_to_one():
  51.     parent = session.query(Parent).first()
  52.     if parent:
  53.         session.delete(parent)
  54.         session.commit()
复制代码
单对多级联

实现思路

单对多关系表示一个父对象可以关联多个子对象,子对象只关联一个父对象。使用 relationship 建立关联,cascade 参数实现级联操作。
代码示例
  1. # 定义单对多关系的模型
  2. class Team(Base):
  3.     __tablename__ = 'team'
  4.     id = Column(Integer, primary_key=True)
  5.     name = Column(String)
  6.     # 单对多关系,设置级联操作
  7.     players = relationship("Player", back_populates="team", cascade="all, delete-orphan")
  8. class Player(Base):
  9.     __tablename__ = 'player'
  10.     id = Column(Integer, primary_key=True)
  11.     name = Column(String)
  12.     team_id = Column(Integer, ForeignKey('team.id'))
  13.     team = relationship("Team", back_populates="players")
  14. # 创建操作
  15. def create_one_to_many():
  16.     team = Team(name='Team A')
  17.     player1 = Player(name='Player 1')
  18.     player2 = Player(name='Player 2')
  19.     team.players.extend([player1, player2])
  20.     session.add(team)
  21.     session.commit()
  22.     return team
  23. # 读取操作
  24. def read_one_to_many():
  25.     team = session.query(Team).first()
  26.     if team:
  27.         print(f"Team: {team.name}, Players: {[player.name for player in team.players]}")
  28.     return team
  29. # 更新操作
  30. def update_one_to_many():
  31.     team = session.query(Team).first()
  32.     if team:
  33.         team.name = 'Updated Team'
  34.         for player in team.players:
  35.             player.name = f"Updated {player.name}"
  36.         session.commit()
  37.     return team
  38. # 删除操作
  39. def delete_one_to_many():
  40.     team = session.query(Team).first()
  41.     if team:
  42.         session.delete(team)
  43.         session.commit()
复制代码
多对多级联

实现思路

多对多关系需要一个中间表来关联两个实体。通过 relationship 的 secondary 参数指定中间表,并使用 cascade 实现级联操作。
代码示例
  1. # 定义中间表
  2. association_table = Table('association', Base.metadata,
  3.                           Column('student_id', Integer, ForeignKey('student.id')),
  4.                           Column('course_id', Integer, ForeignKey('course.id'))
  5.                           )
  6. # 定义多对多关系的模型
  7. class Student(Base):
  8.     __tablename__ = 'student'
  9.     id = Column(Integer, primary_key=True)
  10.     name = Column(String)
  11.     # 多对多关系,设置级联操作
  12.     courses = relationship("Course", secondary=association_table, back_populates="students", cascade="all, delete")
  13. class Course(Base):
  14.     __tablename__ = 'course'
  15.     id = Column(Integer, primary_key=True)
  16.     name = Column(String)
  17.     students = relationship("Student", secondary=association_table, back_populates="courses")
  18. # 创建操作
  19. def create_many_to_many():
  20.     student = Student(name='Student')
  21.     course1 = Course(name='Course 1')
  22.     course2 = Course(name='Course 2')
  23.     student.courses.extend([course1, course2])
  24.     session.add(student)
  25.     session.commit()
  26.     return student
  27. # 读取操作
  28. def read_many_to_many():
  29.     student = session.query(Student).first()
  30.     if student:
  31.         print(f"Student: {student.name}, Courses: {[course.name for course in student.courses]}")
  32.     return student
  33. # 更新操作
  34. def update_many_to_many():
  35.     student = session.query(Student).first()
  36.     if student:
  37.         student.name = 'Updated Student'
  38.         for course in student.courses:
  39.             course.name = f"Updated {course.name}"
  40.         session.commit()
  41.     return student
  42. # 删除操作
  43. def delete_many_to_many():
  44.     student = session.query(Student).first()
  45.     if student:
  46.         session.delete(student)
  47.         session.commit()
复制代码
测试代码
  1. if __name__ == "__main__":
  2.     # 单对单关系操作
  3.     print("One-to-One Relationship:")
  4.     create_one_to_one()
  5.     read_one_to_one()
  6.     update_one_to_one()
  7.     read_one_to_one()
  8.     delete_one_to_one()
  9.     # 单对多关系操作
  10.     print("\nOne-to-Many Relationship:")
  11.     create_one_to_many()
  12.     read_one_to_many()
  13.     update_one_to_many()
  14.     read_one_to_many()
  15.     delete_one_to_many()
  16.     # 多对多关系操作
  17.     print("\nMany-to-Many Relationship:")
  18.     create_many_to_many()
  19.     read_many_to_many()
  20.     update_many_to_many()
  21.     read_many_to_many()
  22.     delete_many_to_many()
  23.     session.close()
复制代码
代码解释


  • 单对单关系:Parent 和 Child 模型通过 relationship 建立一对一关联,uselist=False 明确为单对单,cascade="all, delete-orphan" 确保父对象删除时子对象也被删除。
  • 单对多关系:Team 和 Player 模型建立一对多关联,Team 可关联多个 Player,同样使用 cascade="all, delete-orphan" 实现级联删除。
  • 多对多关系:Student 和 Course 通过中间表 association_table 建立多对多关联,cascade="all, delete" 保证删除学生时相关课程关联也被删除。
注意事项


  • 上述代码使用 SQLite 数据库,你可以根据需求更换数据库引擎。
  • 每次操作完成后记得提交会话(session.commit())和关闭会话(session.close())。

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册