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 层面建立各种关系,使数据管理更加方便。
 
                     
                    
                 
                    
                 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号