6-过滤条件查询.py

请解释下面函数

import db
from datetime import datetime




# 1. 创建一个与数据库对应的模型类对象
class Student(db.Model):
    """学生表模型"""
    __tablename__ = "tb_student"
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(20))
    sex = db.Column(db.Boolean, default=True)
    age = db.Column(db.SmallInteger)
    classes = db.Column("class", db.SMALLINT)
    description = db.Column(db.Text)
    status = db.Column(db.Boolean, default=1)
    addtime = db.Column(db.DateTime, default=datetime.now)
    orders = db.Column(db.SMALLINT, default=1)


    def __repr__(self):
        return f"<{self.__class__.__name__} {self.name}>"




if __name__ == '__main__':
    """过滤条件查询"""
    """
    filter_by - 精确查询
    filter_by支持值相等=号操作,不能使用大于、小于或不等于的操作一律不能使用
    """
    # # 单个字段条件
    # students = db.session.query(Student).filter_by(name="小明1号").all()
    # print(students)


    # # 多个and条件
    # students = db.session.query(Student).filter_by(sex=1, age=18).all()
    # print(students)


    """
    filter - 匹配查询
    支持所有的运算符表达式,比filter精确查询要更强大
    注意:条件表达式中的字段名必须写上模型类名
    filter中的判断相等必须使用==2个等号
    """
    # # 获取查询结果集的所有数据,列表
    # students = db.session.query(Student).filter(Student.age > 17).all()
    # print(students) # [<Student 小明1号>, <Student 小明1号>, <Student 小明3号>, <Student 小明4号>]
    #
    # # 获取查询结果集的第一条数据,模型对象
    # students = db.session.query(Student).filter(Student.age < 18).first()
    # print(students) # <Student 小明1号>


    """in运算符"""
    students = db.session.query(Student).filter(Student.id.in_([1, 3, 4])).all()
    print(students) # [<Student 小明1号>, <Student 小明1号>, <Student 小明2号>]


    """多条件表达式"""
    """多个or条件"""
    # from sqlalchemy import or_
    # # 查询302或303班的学生
    # students = db.session.query(Student).filter(or_(Student.classes==303, Student.classes==302)).all()
    # print(students) # [<Student 小明1号>, <Student 小明2号>]


    """多个and条件"""
    # students = db.session.query(Student).filter(Student.age==18, Student.sex==1).all()
    # print(students) # [<Student 小明1号>, <Student 小明3号>]


    # from sqlalchemy import and_
    # students = db.session.query(Student).filter(and_(Student.age == 18, Student.sex == 1)).all()
    # print(students) # [<Student 小明1号>, <Student 小明3号>]


    """and_主要用于与or_一起使用的"""
    # 查询305的18岁男生 或者 305班的17岁女生
    from sqlalchemy import and_, or_
    # students = db.session.query(Student).filter(
    #     or_(
    #         and_(Student.classes==305, Student.age==18, Student.sex==1),
    #         and_(Student.classes==305, Student.age==17, Student.sex==2),
    #     )
    # ).all()


    students = db.session.query(Student).filter(
        and_(
            Student.classes == 305,
            or_(
                and_(Student.age == 18, Student.sex == 1),
                and_(Student.age == 17, Student.sex == 2)
            )
        )
    ).all()


    print(students) # [<Student 小明1号>, <Student 小明4号>]

Student 模型类与查询方法表格化总结


1. Student 模型类字段定义

字段名 类型 数据库列名 默认值 注释 是否主键
id Integer id - 主键,唯一标识学生记录
name String(20) name - 学生姓名,最长 20 字符
sex Boolean sex True 性别(True=男,False=女)
age SmallInteger age - 学生年龄
classes SmallInteger class - 班级编号(字段名因关键字冲突)
description Text description - 学生描述信息
status Boolean status 1 状态(1=启用,0=禁用)
addtime DateTime addtime func.now() 记录创建时间
orders SmallInteger orders 1 排序权重

2. 查询方法对比

方法名 用途 支持的比较符 示例条件 示例代码
filter_by 精确匹配查询 = 查询名字为“小明1号”的学生 Student.query.filter_by(name="小明1号")
filter 通用条件查询 所有运算符(如 >, <, != 查询年龄大于 17 岁的学生 Student.query.filter(Student.age > 17)

3. 特殊查询语法

运算符/函数 描述 示例条件 示例代码
in_() 查询字段值在指定列表中 ID 在 [1, 3, 4] 中的学生 Student.query.filter(Student.id.in_([1, 3, 4]))
or_() 逻辑“或”条件 班级为 302 303 班的学生 Student.query.filter(or_(Student.classes == 302, Student.classes == 303))
and_() 逻辑“与”条件 年龄为 18 性别为男的学生 Student.query.filter(and_(Student.age == 18, Student.sex == True))

posted @ 2025-03-26 16:20  千陌666  阅读(22)  评论(0)    收藏  举报