Flask——sqlalchemy排序,高级查询

本文详细介绍了SQLAlchemy中排序的实现方式,包括升序、降序及模型中预设排序。同时,深入探讨了limit、offset、切片、group_by、having及子查询等高级查询技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

排序

sqlalchemy中的排序,就是在查询的后面加上.order_by(依据排序的字段) ,默认排序是升序。倒序就是在排序字段的后面加上 .desc() 或者在排序字段的前面加上负号-。如果不想在查询的时候排序,可以在模型里面设置,
在模型中使用 __mapper_args__={"order_by":依据排序的字段},如下图所示

class Orderby(Base):
    __tablename__ = 'orderby_Demo'
    id = Column(Integer,autoincrement=True,primary_key=True)
    name = Column(String(50))

    def __repr__(self):
        return "Orderby(name:%s)" % self.name
        
     __mapper_args__ = {
        "order_by":id.desc() # -id
    }
# Base.metadata.drop_all()
Base.metadata.create_all()
session =  sessionmaker(bind=engine)()

# 如果不在模型中设置
# session.query(Orderby).order_by(Orderby.id.desc()).all()
# 这里追加了.desc() ,显示为倒序
# session.query(Orderby).order_by(-Orderby.id).all()
# 或者在 依据排序的字段前面加上负号 -

result = session.query(Orderby).all()
# 这是在模型中设置之后的操作
print(result)

limit,offset和切片

如何要和order_by在一起使用,order_by写在最前面

  • limit:一个参数,取出前几条数据 session.query(类).limit(3)
  • offset:一个参数,下标从0开始,表示从第几条数据开始session.query(类).offset(2)
  • 切片session.query(类).all()[2:5]

group_by

group_by 顾名思义,就是分组

result = session.query(User.gender,func.count(User.id)).group_by(User.gender).all()
for i in result:
    print(i)

having

having 的作用跟where一样,只不过having是追加在group_by后面使用的条件判断,where是在from后面使用的条件判断。

result = session.query(User.age,func.count(User.id)).group_by(User.age).having(User.age>30).all()
for i in result:
    print(i)

子查询

子查询其实就是嵌套查询

先写内层查询,再写外层查询
subquery标记为子查询 可供给外部查询使用
查询中.label(‘XX’)给属性起别名

sub = session.query(User.gender.label('gender'),User.age.label('age')).filter(User.username == 'name7').subquery()
result = session.query(User).filter(User.gender==sub.c.gender ,User.age == sub.c.age)


for i in result:
    print(i.username)
### 如何使用 Flask-SQLAlchemy 实现多表联查 在 Flask-SQLAlchemy 中,即使未显式定义外键关系,仍然能够通过 SQLAlchemy 的 `join` 方法实现多表联合查询。以下是具体方法以及示例: #### 使用 `join` 进行多表联查 SQLAlchemy 提供了灵活的 `join` 方法用于执行不同类型的连接操作(如 INNER JOIN、LEFT OUTER JOIN 等)。下面是一个基于 Flask-SQLAlchemy 的多表联查实例。 假设我们有两个模型:`User` 和 `Post`,它们分别代表用户和帖子的关系。虽然这两个表之间没有外键约束,但我们仍可通过手动指定连接条件完成查询。 ```python from flask_sqlalchemy import SQLAlchemy db = SQLAlchemy() class User(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(50)) class Post(db.Model): id = db.Column(db.Integer, primary_key=True) title = db.Column(db.String(100)) user_id = db.Column(db.Integer) # 查询所有用户的帖子 query_result = db.session.query(User.name, Post.title).\ join(Post, User.id == Post.user_id).all() # 手动指定了连接条件[^4] print(query_result) ``` 上述代码展示了如何通过 `join` 方法将 `User` 表与 `Post` 表相连,并提取所需字段。这里的关键在于明确传递给 `join` 函数的第二个参数作为连接条件。 #### 不依赖外键的联查方式 如果不想或者无法在外键上建立硬性约束,则可以直接依靠 SQL 条件表达式构建逻辑上的关联。这种方式尤其适用于那些历史遗留系统或第三方数据库结构不可更改的情况。 例如,在某些场景下可能需要从多个无直接联系的表格中抽取数据并组合展示。此时可采用类似以下形式的操作: ```python result = db.session.query(TableA.column_a, TableB.column_b).\ filter(TableA.some_column == TableB.other_column).all() ``` 此片段表明即使缺乏正式声明的外键绑定,只要存在共同参照项即可达成预期效果[^1]。 #### ORM 映射基础回顾 值得注意的是,为了更好地理解和运用这些高级特性,掌握 SQLAlchemy 的基本概念至关重要。特别是它的 **对象关系映射 (ORM)** 功能使得我们可以把 Python 类当作数据库里的表来对待,极大地简化了开发流程[^2]。 --- ### 总结 综上所述,借助于 SQLAlchemy 强大的 API 支持,无论是常规情况还是特殊需求下的多表联合查询都能得到妥善解决。只需合理设置过滤器及调用相应函数便可轻松获取目标记录集合。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值