当前位置 主页 > 网站技术 > 代码类 >

    flask的orm框架SQLAlchemy查询实现解析

    栏目:代码类 时间:2019-12-12 18:09

    这篇文章主要介绍了flask的orm框架SQLAlchemy查询实现解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    一对多,多对多是什么?

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

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

    一对多查询

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

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

    sqlalchemy 模板创建表的代码:

    from flask import Flask, render_template, request, flash, redirect
    from flask_sqlalchemy import SQLAlchemy
    
    app = Flask(__name__,static_folder="static",template_folder="templates")
    
    # 设置数据库连接属性
    app.config['SQLALCHEMY_DATABASE_URI'] = '×××'
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
    
    # 实例化 ORM 操作对象
    db = SQLAlchemy(app)
    
    # 班级表
    class Classes(db.Model):
      __tablename__ = "classes"
      id = db.Column(db.Integer,primary_key=True)
      name = db.Column(db.String(20),nullable=False,unique=True)
    
    # 学生表
    class Students(db.Model):
      __tablename__ = "students"
      id = db.Column(db.Integer,primary_key=True)
      name = db.Column(db.String(40),nullable=False)
      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')