sqlalchemy 多对多

本文深入探讨了使用ORM技术进行数据库表关系映射的方法,包括学生与课程之间的多对多关联,并通过具体示例展示了如何在Python环境下进行数据的增删改查操作,特别关注了多表联查的技术细节。

一、表关系

class Student(Base):
    __tablename__ = 'student'
    id = Column(Integer, primary_key=True)
    name = Column(String(32), index=True, nullable=False)

    course_list = relationship('Course', secondary='student2course', backref='student_list')

class Course(Base):
    __tablename__ = 'course'
    id = Column(Integer, primary_key=True)
    title = Column(String(32), index=True, nullable=False)

class Student2Course(Base):
    __tablename__ = 'student2course'
    id = Column(Integer, primary_key=True, autoincrement=True)
    student_id = Column(Integer, ForeignKey('student.id'))
    course_id = Column(Integer, ForeignKey('course.id'))

    __table_args__ = (
        UniqueConstraint('student_id', 'course_id', name='uix_stu_cou'), # 联合唯一索引
        # Index('ix_id_name', 'name', 'extra'),                          # 联合索引
    )

注意:要自己创建第三张表

二、操作数据

# 1. 创建一个课程,创建2学生,两个学生选新创建的课程。
obj = Course(title='英语')
obj.student_list = [Student(name='b'),Student(name='c')]

session.add(obj)
session.commit()

# 2. 三张表join
ret = session.query(Student2Course.id,Student.name,Course.title).join(Student,Student2Course.student_id==Student.id,isouter=True).join(Course,Student2Course.course_id==Course.id,isouter=True).order_by(Student2Course.id.asc())
for row in ret:
    print(row)
# 3. “a”选的所有课
# 原生
ret = session.query(Student2Course.id,Student.name,Course.title).join(Student,Student2Course.student_id==Student.id,isouter=True).join(Course,Student2Course.course_id==Course.id,isouter=True).filter(Student.name=='a').order_by(Student2Course.id.asc()).all()
print(ret)
# relation
obj = session.query(Student).filter(Student.name=='a').first()
for item in obj.course_list:
    print(item.title)

# 4. 选了“生物”的所有人
obj = session.query(Course).filter(Course.title=='生物').first()
for item in obj.student_list:
    print(item.name)

 

转载于:https://www.cnblogs.com/wt7018/p/11617848.html

在Flask-SQLAlchemy中进行多对多查询可以通过中间表来实现。以下是一个示例代码: 假设我们有两个模型:User和Role,它们之间是多对多的关系。我们可以创建一个名为user_role的中间表来存储用户和角色之间的关系。 ```python from flask import Flask from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'your_database_uri' db = SQLAlchemy(app) user_role = db.Table('user_role', db.Column('user_id', db.Integer, db.ForeignKey('user.id')), db.Column('role_id', db.Integer, db.ForeignKey('role.id')) ) class User(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(50)) roles = db.relationship('Role', secondary=user_role, backref=db.backref('users', lazy='dynamic')) class Role(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(50)) # 查询某个用户的所有角色 user = User.query.filter_by(name='wang').first() roles = user.roles # 查询某个角色的所有用户 role = Role.query.filter_by(name='admin').first() users = role.users # 查询拥有特定角色的所有用户 role = Role.query.filter_by(name='admin').first() users = User.query.filter(User.roles.contains(role)).all() ``` 在上述代码中,我们定义了一个中间表user_role,它包含了user_id和role_id两个外键。User模型和Role模型之间通过db.relationship进行关联,并通过secondary参数指定了中间表。这样,我们就可以通过User.roles和Role.users来查询相关的角色和用户了。 请注意,你需要根据自己的数据库设置来配置SQLALCHEMY_DATABASE_URI的值。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Flask-SQLAlchemy的安装使用 一对多 多对多join查询](https://blog.youkuaiyun.com/HYESC/article/details/129022912)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值