flask框架之表对应关系 一对一 多对多

本文介绍了一种使用Python和SQLAlchemy实现数据库中多对多关系的方法。通过创建教师表、班级表及中间表来关联两者,实现了灵活的数据关系映射。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一对一 不理解
多对多: 一个老师会对应多个班级 1个班级也可能对应多个老师,多个班级对应多个老师就是多对多的关系
有一个老师的表格 一个学生的表格 一个老师学生对应关系的中间表格
多对多的实现是通过建立一个中间表的方式实现的:
同理:
基础程序:

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Integer,Column,String,DECIMAL,Boolean,ForeignKey,TEXT
from sqlalchemy.orm import sessionmaker,relationship
from sqlalchemy import Table

# 连接数据库

# 地址
HOSTNAME = '127.0.0.1'

# 数据库
# 几栋
DATABASE = 'relation'

# 端口
# 门牌号
PORT = 3306

# 用户名和密码
# 钥匙
USERNAME = 'root'
PASSWORD = 'root'

DB_URL = 'mysql+pymysql://{}:{}@{}:{}/{}'.format(USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE)

engine = create_engine(DB_URL)

# 都要继承这个函数生成的基类
Base = declarative_base(engine)

teacher表和classes表:

class Teacher(Base):
    __tablename__ = 'teacher'

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

    classes = relationship('Classes',backref='teacher',secondary=teacher_classes)

    def __str__(self):
        return 'Teacher(name:%s)' % self.name

class Classes(Base):
    __tablename__ = 'classes'

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

    def __str__(self):
        return 'Classes(name:%s)' % self.name

中间表:

teacher_classes = Table(
    'teacher_classes',
    Base.metadata,
    Column('teacher_id',Integer,ForeignKey('teacher.id')),
    Column('classes_id',Integer,ForeignKey('classes.id'))

)

这样,就把两张表形成多对多的关系

生成表和添加数据:

Base.metadata.create_all()

Session = sessionmaker(bind=engine)
session = Session()

teacher1 = Teacher(name='jerry')
teacher2 = Teacher(name='amy')

classes1 = Classes(name='基础班')
classes2 = Classes(name='进阶班')

# print(teacher1.classes)  # 如果不添加东西默认是空的列表  可以用append
teacher1.classes.append(classes1)
teacher1.classes.append(classes2)
teacher2.classes.append(classes1)
teacher2.classes.append(classes2)

session.add(teacher1)
session.add(teacher2)
session.commit()

查看表内容:

# 根据老师查班级
teacher = session.query(Teacher).first()
#print(teacher)
for item in teacher.classes:
    print(item)

# 根据班级查老师
classes = session.query(Classes).first()
for item in classes.teacher:
    print(item)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值