请解释下面函数
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)) |