Loading

数量限制、排序与事务操作

查询限制

在关于 SQLAlchemy 教程的前文中,你应该知道如何使用 selectquery 方法来查询数据。接下来我们尝试使用 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 子句。通常,offsetlimit 一起使用,用于分页查询。以下代码演示了跳过 id 为 1 的学生,然后查询出来学生ID为 23 的学生。

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())
# 当班级相同时,安装学生的编号大小升序

事务操作

事务操作允许你将多个数据库操作打包在一起,要么全部成功,要么全部失败。使用 begincommitrollback 方法可以实现事务操作。

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 记录,如果操作成功则提交事务,如果发生异常则回滚事务并打印异常。

posted @ 2024-07-13 18:14  顾平安  阅读(42)  评论(0编辑  收藏  举报