Flask数据库关系:一对多,多对多

1 一对多

1.0 数据表设计

一:Project类
多:Camera类(外键属性)

序号类型
1projectinfo
2camera_device_info
from app import db
from sqlalchemy import Column
class Project(db.Model):
    __tablename__ = "projectInfo"
    __table_args__ = {'mysql_collate':'utf8_general_ci'}
    id = db.Column(db.Integer, primary_key=True)
    uu_id = db.Column(db.Integer, unique=True)
    project_code = db.Column(db.String(320), unique=True)
    project_name = db.Column(db.String(320), unique=False)
    project_describe = db.Column(db.String(320), unique=False)
    # relation with peopleInfo
    peoples = db.relationship("People", 
    secondary=people_project,
    back_populates="projects")
    '''
    classname
    tablename
    return query object
    '''
    camera_devices = db.relationship("CameraDevice", backref="projectInfo", lazy="dynamic", cascade="all, delete-orphan", passive_deletes=True)

class CameraDevice(db.Model):
    __table_name__ = "camera_device_info"
    __table_args__ = {"mysql_collate":"utf8_general_ci"}
    id = db.Column(db.Integer, primary_key=True)
    camera_device_code = db.Column(db.String(320), unique=False)
    camera_device_name = db.Column(db.String(320), unique=False)
    camera_device_location = db.Column(db.String(320), unique=False)
    camera_device_describe = db.Column(db.String(320), unique=False)
    project_id = db.Column(db.Integer, db.ForeignKey("projectInfo.uu_id", ondelete="CASCADE"))

1.2 查询

project_info = Project.query.filter_by(uu_id=1).first()
camera_infos = project_info.camera_devices
for camera_info in camera_infos.all():
	camera = camera_info.camera_device_name

1.3 删除孤儿数据

删除主键同时删除外键对应的数据。
主一表:

camera_devices = db.relationship("CameraDevice", backref="projectInfo", lazy="dynamic", cascade="all, delete-orphan", passive_deletes=True)

多外键表:

project_id = db.Column(db.Integer, db.ForeignKey("projectInfo.uu_id", ondelete="CASCADE"))

2 多对多

2.1 数据表设计

多:Student类
多:Teacher类

序号类型
1students_info
2teachers_info
3中间student_teacher
from app import db
from sqlalchemy import Column

student_teacher = db.Table('student_teacher', 
    db.Column("student_id", db.Integer, db.ForeignKey("students_info.id")),
    db.Column("teacher_id", db.Integer, db.ForeignKey("teachers_info.id"))
    )


class Student(db.Model):
    __tablename__ = "students_info"
    __table_args__ = {'mysql_collate':'utf8_general_ci'}
    id = db.Column(db.Integer, primary_key=True)
    u_id = db.Column(db.String(320), unique=True)
    name = db.Column(db.String(320), unique=False)
    grade = db.Column(db.String(320), unique=False)
    teachers = db.relationship("Teacher", 
    secondary=student_teacher,
    back_populates="students")
    def __repr__(self):
        return "<Student %r>" %self.name

class Teacher(db.Model):
    __tablename__ = "teachers_info"
    __table_args__ = {'mysql_collate':'utf8_general_ci'}
    id = db.Column(db.Integer, primary_key=True)
    u_id = db.Column(db.String(320), unique=True)
    name = db.Column(db.String(320), unique=False)
    office = db.Column(db.String(320), unique=False)
    students = db.relationship("Student", 
    secondary=student_teacher,
    back_populates="teachers")

2.2 查询数据

students_info = Student.query.filter_by(u_id="001").first()
teachers = students_info.teachers
for teacher in teachers:
	name = teacher.name

2.3 插入数据

stu1 = Student(u_id="001", name="小一", grade="100")
stu2 = Student(u_id="002", name="小二", grade="100")
stu3 = Student(u_id="003", name="小三", grade="100")

teach1 = Teacher(u_id="001", name="师一", office="001")
teach2 = Teacher(u_id="002", name="师二", office="002")
teach3 = Teacher(u_id="003", name="师三", office="003")
# 多对多数据添加
stu1.teachers = [teach1, teach2]
stu2.teachers = [teach2]
stu3.teachers = [teach1, teach2, teach3]
# 数据库事务
db.session.add_all([stu1, stu2, stu2])
db.session.add_all([teach1, teach2, teach3])

【参考文献】
[1]https://www.jianshu.com/p/ac065ac70f34
[2]https://www.cnblogs.com/notzy/p/9187232.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
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.csdn.net/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 ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天然玩家

坚持才能做到极致

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值