查询限制
在关于 SQLAlchemy 教程的前文中,你应该知道如何使用 select
和 query
方法来查询数据。接下来我们尝试使用 limit
方法来限制返回的结果数量。
import db
from model import Student
# 使用 select 方法限制结果数量
q = db.select(Student).where(Student.id.in_([1, 2, 3])).limit(2)
students = db.session.execute(q).scalars()
for stu in students:
print(stu.to_dict())
# 或者使用 query 方法限制结果数量
students = db.session.query(Student).filter(Student.id.in_([1, 2, 3])).limit(2).all()
for stu in students:
print(stu.to_dict())
在 SQL 语句中,看起来就应该是这样的:
SELECT * FROM tb_student WHERE id IN (1, 2, 3) LIMIT 2;
使用 offset
方法
offset
方法用于跳过查询结果中的前 N 条记录。它在 SQL 中对应的是 OFFSET
子句。通常,offset
与 limit
一起使用,用于分页查询。以下代码演示了跳过 id 为 1
的学生,然后查询出来学生ID为 2
、3
的学生。
import db
from model import Student
# 使用 select 方法结合 offset
# 虽然是 limit(x).offset(y) 但是我们应该清楚:先跳过 y 条,取出 y 后面的 x 条
q = db.select(Student).where(Student.id.in_([1, 2, 3])).limit(2).offset(1)
students = db.session.execute(q).scalars()
for stu in students:
print(stu.to_dict())
# 使用 query 方法结合 offset
students = db.session.query(Student).filter(Student.id.in_([1, 2, 3])).limit(2).offset(1).all()
for stu in students:
print(stu.to_dict())
换作 SQL 语句即是:
SELECT * FROM tb_student WHERE id IN (1, 2, 3) LIMIT 2 OFFSET 1;
结果的排序
SQLAlchemy 提供了 order_by
方法来对查询结果进行排序。你可以按升序或降序排序。
import db
from model import Student
# 按 class_ 字段升序排序
q = db.select(Student).order_by(Student.class_.asc())
students = db.session.execute(q).scalars()
for stu in students:
print(stu.to_dict())
# 按 id 字段降序排序
q = db.select(Student).order_by(Student.id.desc())
students = db.session.execute(q).scalars()
for stu in students:
print(stu.to_dict())
你可以看到,所谓降序、升序是通过字段的两个属性去决定:
模型名.字段名.desc() --- 按照字段的值`降`序排序
模型名.字段名.asc() --- 按照字段的值`升`序排序
如果需要多重字段排序,为 order_by
方法传入数量合适的参数即可。比如:
db.select(Student).order_by(Student.class_.desc(), Student.id.asc())
# 当班级相同时,安装学生的编号大小升序
事务操作
事务操作允许你将多个数据库操作打包在一起,要么全部成功,要么全部失败。使用 begin
、commit
和 rollback
方法可以实现事务操作。
import db
from model import Student
try:
# 开始事务
db.session.begin()
# 这里可以执行多个数据库操作
student = Student(
id=2,
name='李小红',
age=19,
class_=4,
description='学习很努力',
)
db.session.add(student)
# 提交事务
db.session.commit()
except Exception as e:
print(e)
# 回滚事务
db.session.rollback()
上面的代码中,我们开始了一个事务,添加了一条新的 Student
记录,如果操作成功则提交事务,如果发生异常则回滚事务并打印异常。