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号