您当前的位置: 首页 >  学无止境 >  文章详情

在Python的SQLAlchemy ORM中,按指定字段排序查询

时间: 2025-09-18 【学无止境】 阅读量:共8人围观

简介 在 Python 的 SQLAlchemy ORM 中,使用 Engword.query.order_by() 来按指定字段排序查询。多种实现方式。

1. 单个字段排序

# 升序排序(默认) results = Engword.query.order_by(Engword.created_at).all() # 降序排序 results = Engword.query.order_by(Engword.created_at.desc()).all()

2. 多个字段排序

# 先按category升序,再按created_at降序 results = Engword.query.order_by( Engword.category.asc(), Engword.created_at.desc() ).all() # 或者混合使用 results = Engword.query.order_by( Engword.category, # 默认升序 Engword.frequency.desc() ).all()

3. 只返回特定字段

from sqlalchemy.orm import load_only # 只返回id和word字段,并按word排序 results = Engword.query.options( load_only(Engword.id, Engword.word) ).order_by(Engword.word.asc()).all() # 对于每个结果,只能访问 id 和 word 字段 for result in results: print(result.id, result.word) # print(result.created_at) # 这会报错,因为没加载这个字段

4. 使用 with_entities 指定字段

from sqlalchemy.orm import Query # 返回特定字段的元组列表 results = Engword.query.with_entities( Engword.id, Engword.word, Engword.meaning ).order_by(Engword.word.asc()).all() for id, word, meaning in results: print(f"{id}: {word} - {meaning}")

5. 使用字典形式返回

from sqlalchemy.orm import aliased # 返回字典形式的结果 results = Engword.query.with_entities( Engword.id.label('word_id'), Engword.word, Engword.pronunciation ).order_by(Engword.word.asc()).all() for result in results: print(f"ID: {result.word_id}, Word: {result.word}")

6. 带条件的排序查询

# 查询特定类别的单词并按频率排序 results = Engword.query.filter( Engword.category == 'technology' ).order_by(Engword.frequency.desc()).all() # 查询包含某个字母的单词并按长度排序 results = Engword.query.filter( Engword.word.like('%a%') ).order_by( Engword.word_length.asc(), Engword.word.asc() ).all()

7. 分页查询

# 获取第2页,每页50条,按创建时间倒序 page = 2 per_page = 50 results = Engword.query.order_by( Engword.created_at.desc() ).offset((page - 1) * per_page).limit(per_page).all()

8.自定义排序规则

from sqlalchemy import case # 按自定义优先级排序:先显示特定类别的单词 custom_order = case( { 'basic': 1, 'advanced': 2, 'technical': 3 }, value=Engword.category ) results = Engword.query.order_by(custom_order.asc()).all()

9. 按关联模型字段排序

# 如果Engword有关联的Category模型 from sqlalchemy.orm import joinedload results = Engword.query.options( joinedload(Engword.category) ).order_by( Engword.category.name.asc(), # 按关联的category名称排序 Engword.word.asc() ).all()

10. 按计算字段排序

from sqlalchemy import func # 按单词长度排序 results = Engword.query.order_by( func.length(Engword.word).asc() ).all() # 按创建时间的年月排序 results = Engword.query.order_by( func.date_format(Engword.created_at, '%Y-%m').desc() ).all()

示例1:获取单词表并按字母顺序排列

def get_words_alphabetically(): """按字母顺序返回所有单词""" return Engword.query.with_entities( Engword.id, Engword.word, Engword.meaning ).order_by(Engword.word.asc()).all()

示例2:获取最常用的单词

def get_most_frequent_words(limit=100): """获取使用频率最高的单词""" return Engword.query.order_by( Engword.frequency.desc() ).limit(limit).all()

示例3:按类别分组排序

def get_words_by_category(): """按类别分组,每类按字母排序""" return Engword.query.order_by( Engword.category.asc(), Engword.word.asc() ).all()

示例4:搜索并排序

def search_words(keyword, sort_by='word'): """搜索单词并按指定字段排序""" query = Engword.query.filter( Engword.word.ilike(f'%{keyword}%') ) # 动态排序 if sort_by == 'frequency': query = query.order_by(Engword.frequency.desc()) elif sort_by == 'length': query = query.order_by(func.length(Engword.word).asc()) else: # 默认按单词排序 query = query.order_by(Engword.word.asc()) return query.all()

性能优化建议

1. 为排序字段添加索引

# 在模型定义中,确保常用排序字段有索引 class Engword(db.Model): __tablename__ = 'engwords' id = db.Column(db.Integer, primary_key=True) word = db.Column(db.String(100), index=True) # 为排序字段添加索引 frequency = db.Column(db.Integer, index=True) created_at = db.Column(db.DateTime, index=True)

2. 只选择需要的字段

# 避免 SELECT *,只选择需要的字段 results = Engword.query.with_entities( Engword.id, Engword.word ).order_by(Engword.word.asc()).all()

3. 使用分页避免内存溢出

# 对于大量数据,使用分页 def get_words_in_batches(batch_size=1000): """分批获取单词""" page = 1 while True: words = Engword.query.order_by( Engword.id.asc() ).paginate(page=page, per_page=batch_size) if not words.items: break yield words.items page += 1

上一篇:WebSocket断线重连实现

文章评论
Copyright (C) 2023- 小祥驿站 保留所有权利 蜀ICP备 17034318号-2  公安备案号 50010302004554