SQLAlchemy 多表关系

在 SQLAlchemy 中,可以使用外键(Foreign Key)和关系(Relationship)来在两个表之间建立关联关系。主要方法有两种:

​ 1. 使用 ForeignKey(在表中建立外键字段)

​ 2. 使用 relationship(在 ORM 层面建立 Python 对象关系)


示例:一对多(One-to-Many)关系

假设我们有两个表:

​ • User 表(用户)

​ • Post 表(帖子,每个帖子属于一个用户)

from sqlalchemy import Column, Integer, String, ForeignKey
from sqlalchemy.orm import relationship
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class User(Base):
    __tablename__ = 'users'

    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String(50), nullable=False)

    # 关系:一个用户可以有多个帖子
    posts = relationship("Post", back_populates="author")

class Post(Base):
    __tablename__ = 'posts'

    id = Column(Integer, primary_key=True, autoincrement=True)
    title = Column(String(100), nullable=False)
    user_id = Column(Integer, ForeignKey('users.id'))  # 外键,指向 users 表的 id

    # 关系:每个帖子属于一个用户
    author = relationship("User", back_populates="posts")

说明:

​ • user_id = Column(Integer, ForeignKey('users.id')) 在 Post 表中建立外键,关联 User 表的 id 字段。

​ • relationship("Post", back_populates="author") 在 User 表中定义 posts 关系,指向 Post 表。

​ • relationship("User", back_populates="posts") 在 Post 表中定义 author 关系,指向 User 表。


示例:多对多(Many-to-Many)关系

假设我们有:

​ • Student(学生)

​ • Course(课程)

​ • 一个关联表 student_course 用于建立 Student 和 Course 之间的多对多关系

from sqlalchemy import Table

# 关联表(不使用 ORM 模型)
student_course = Table(
    'student_course', Base.metadata,
    Column('student_id', Integer, ForeignKey('students.id'), primary_key=True),
    Column('course_id', Integer, ForeignKey('courses.id'), primary_key=True)
)

class Student(Base):
    __tablename__ = 'students'

    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String(50), nullable=False)

    # 多对多关系
    courses = relationship("Course", secondary=student_course, back_populates="students")

class Course(Base):
    __tablename__ = 'courses'

    id = Column(Integer, primary_key=True, autoincrement=True)
    title = Column(String(100), nullable=False)

    students = relationship("Student", secondary=student_course, back_populates="courses")

说明:

​ • student_course 是一个 中间表,定义了 student_id 和 course_id 作为联合主键。

​ • relationship(..., secondary=student_course) 让 Student 和 Course 直接建立关系,不需要单独定义 ORM 模型。


其他高级用法:

​ • backref: 让 SQLAlchemy 自动在关联表的另一端创建反向引用。例如:

from sqlalchemy.orm import backref
posts = relationship("Post", backref="author")

这样 Post 模型不需要手动定义 author 关系。

​ • cascade="all, delete": 级联删除

posts = relationship("Post", back_populates="author", cascade="all, delete")

当 User 被删除时,posts 也会被自动删除。

这些方式可以帮助你在 SQLAlchemy ORM 层面建立各种关系,使数据管理更加方便。

posted on 2025-03-10 14:30  朝朝暮Mu  阅读(114)  评论(0)    收藏  举报