flask的orm框架(SQLAlchemy)

  • 一对多,多对多是什么?

一对多。例如,班级与学生,一个班级对应多个学生,或者多个学生对应一个班级。

多对多。例如,学生与课程,可以有多个学生修同一门课,同时,一门课也有很多学生。

  • 一对多查询

如果一个项目,有两张表。分别是班级表,学生表。

在设计数据表时,我们给学生表设置一个外键,指向班级表的 id 。

sqlalchemy 模板创建表的代码:

1 from flask import Flask, render_template, request, flash, redirect 2 from flask_sqlalchemy import SQLAlchemy 3  4 app = Flask(__name__,static_folder="static",template_folder="templates") 5  6 # 设置数据库连接属性 7 app.config['SQLALCHEMY_DATABASE_URI'] = '×××' 8 app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False 9 10 # 实例化 ORM 操作对象11 db = SQLAlchemy(app)12 13 # 班级表14 class Classes(db.Model):15     __tablename__ = "classes"16     id = db.Column(db.Integer,primary_key=True)17     name = db.Column(db.String(20),nullable=False,unique=True)18 19 # 学生表20 class Students(db.Model):21     __tablename__ = "students"22     id = db.Column(db.Integer,primary_key=True)23     name = db.Column(db.String(40),nullable=False)24     cls_id = db.Column(db.Integer,db.ForeignKey("classes.id"))    # 注意要写成(表名.字段名)

创建完表,插入完数据后。

如果我们知道学生的学号,要查学生班级的名称,应该怎么操作呢?

现在可以用一种比较麻烦的方达查询:

cls_id = Students.query.filter(Student.id == 'xxx').first()cls = Classes.query.filter(Classes.id == cls.id).first()print(cls.name)

这样的方法太麻烦了,有没有简单的办法?

上面创建表的代码,在18行可以插入一条语句。

relate_student = db.relationship("Students",backref='relate_class',lazy='dynamic')
  • 其中realtionship描述了Students和Classes的关系。在此文中,第一个参数为对应参照的类"Students"
  • 第二个参数backref为类Students申明新属性的方法
  • 第三个参数lazy决定了什么时候SQLALchemy从数据库中加载数据
    • 如果设置为子查询方式(subquery),则会在加载完Classes对象后,就立即加载与其关联的对象,这样会让总查询数量减少,但如果返回的条目数量很多,就会比较慢
    • 另外,也可以设置为动态方式(dynamic),这样关联对象会在被使用的时候再进行加载,并且在返回前进行过滤,如果返回的对象数很多,或者未来会变得很多,那最好采用这种方式

如果一大堆理论看不明白,那么知道怎么用就可以了。

如果知道学生的姓名,想知道班级的名称,可以这样查:

stu = Students.query.filter(Students.name == 'xxx').first()stu.relate_class.name    # stu.relate_class 会跳到 classes 表

如果知道班级的名称,想返回全部学生的名字的列表,可以这样查:

cls = Classes.query.filter(Classes.name == 'xxx').first()cls.relate_student.name    # cls.relate_stu 会跳到 students 表

可以使用这样的方法,有两个要求,第一是要设置外键,第二是这句语句:

relate_student = db.relationship("Students",backref='relate_class',lazy='dynamic')

注意,什么时候用 relate_student ,什么时候用 relate_class 。以及 relationship 这条语句的书写,要清楚!

  • 多对多查询

假设一堆学生选了不同的课程,这就是多对多关系。

tb_student_course = db.Table('tb_student_course',                             db.Column('student_id', db.Integer, db.ForeignKey('students.id')),                             db.Column('course_id', db.Integer, db.ForeignKey('courses.id'))                             )class Student(db.Model):    __tablename__ = "students"    id = db.Column(db.Integer, primary_key=True)    name = db.Column(db.String(64), unique=True)   # 关联属性,多对多的情况,可以写在任意一个模型类中    relate_courses = db.relationship('Course', secondary=tb_student_course,                              backref='relate_student',                              lazy='dynamic')class Course(db.Model):    __tablename__ = "courses"    id = db.Column(db.Integer, primary_key=True)    name = db.Column(db.String(64), unique=True)

添加测试数据:

# 添加测试数据    stu1 = Student(name='张三')    stu2 = Student(name='李四')    stu3 = Student(name='王五')    cou1 = Course(name='物理')    cou2 = Course(name='化学')    cou3 = Course(name='生物')    stu1.courses = [cou2, cou3]    # 记得要添加关系    stu2.courses = [cou2]    stu3.courses = [cou1, cou2, cou3]    db.session.add_all([stu1, stu2, stu2])    db.session.add_all([cou1, cou2, cou3])    db.session.commit()

要查某个学生修的全部课程,修了某个课程的全部学生:

for course in stu1.relate_courses:    print(course.name)for student in cou2.relate_student:    print(student)
(0)

相关推荐

  • Python Flask Restful token验证

    服务端: #!/usr/bin/env python import os import time from flask import Flask, abort, request, jsonify, g ...

  • 不用一行代码,用 API 操作数据库,你信吗

    来源:Python 技术「ID: pythonall」 数据库的重要性不言而喻,但是数据库操作起来却不容易,需要用到各种管理工具,各种不同的连接方式,如果有方便的,屏蔽不同数据库细节的工具该多好,功夫 ...

  • 第125天:Flask 项目结构

    前面我们了解了 Flask 框架的特性和一些用法,比如创建一个简单应用.做些页面,以及增加鉴权模块等,如果要将 Flask 用于实际项目开发,还需要了解一下 Flask 项目结构. Flask 是一个 ...

  • 小技巧 | 聊聊 Python 中数据库反向生成 Model 最优方案

    小技巧 | 聊聊 Python 中数据库反向生成 Model 最优方案

  • 第46天:Flask数据持久化

    Web 应用离不开数据存储,今天就来学习下 Flask 中如何与数据库交互,最后我们将做一个提交的实例 Flask 中最方便用的数据库框架是 flask_sqlalchamy,是对 SQLAlcham ...

  • Mysql update多表联合更新

    https://blog.csdn.net/u012604745/article/details/80642015 下面我建两个表,并执行一系列sql语句,仔细观察sql执行后表中数据的变化,很容易就 ...

  • MySQL学习——查询表里的数据

    MySQL学习--查询表里的数据 摘要:本文主要学习了使用DQL语句查询表里数据的方法. 数据查询 语法 1 select [distinct] 列1 [as '别名1'], ..., 列n [as ...

  • flask admin-简单且可扩展的Flask管理界面框架

    介绍 Flask-Admin是开箱即用.易于使用的Flask扩展程序,可让您将管理界面添加到Flask应用程序. 它受到django-admin软件包的启发,但实现方式使开发人员可以完全控制最终应用程 ...

  • Python 里最强的Web框架,早就不是Django和Flask了

    Python 里最强的Web框架,早就不是Django和Flask了

  • 选择一个 Python Web 框架:Django vs Flask vs Pyramid

    WEB前端开发社区 昨天 Pyramid, Django, 和 Flask都是优秀的框架,为项目选择其中的哪一个都是伤脑筋的事.我们将会用三种框架实现相同功能的应用来更容易的对比三者.也可以直接跳到框 ...

  • 都2021了,Python 最强Web框架,早就不是Django和Flask了!

    作者:ConnorZhang 链接:https://juejin.cn/post/6944598601674784775 大家好,我是早起. 如果说要用 Python 进行 web 开发,我想你一定会 ...

  • Flask框架从入门到精通之模板表单(二十) | 码农网

    内容简介:当前端使用form表单进行参数传递时候,前端一般都会用js来校验用户输入的参数是否合法.作为后端,不能依赖前端的校验.要在前端校验的基础上在进行一遍校验,防止程序出现异常. 当参数过多时,我 ...

  • 第44天:Flask 框架集成Bootstrap

    前面学习了 Flask 框架的基本用法,以及模板引擎 Jinja2,按理说可以开始自己的 Web 之旅了,不过在启程之前,还有个重要的武器需要了解一下,就是著名的 Bootstrap 框架和 Flas ...

  • Python Django和Flask框架哪个好?

    众所周知,Django.Flask.Tornado是非常受欢迎的三大Web开发框架,Django大而全.flask小而精.Tornado性能高.那么你知道它们之间的区别吗?我们来看看详细的对比介绍吧. ...

  • 什么是Flask框架?有什么特点?

    对Python知识稍有了解的人应该都知道Python有很多框架,其中包含Flask.Django等,今天小编就带大家一起来了解一下Flask框架. Flask是一个使用Python编写的轻量级Web应 ...

  • Django和Flask框架区别?Python学习

    学习Python的过程中,Django框架和Flask框架是比较常见的,各具有非常优异的表现,因此很多人就会问Django和Flask框架有什么区别?该如何选择?我们来看看吧. Django和Flas ...