如何为Peewee查询结果添加从1开始的自定义行号(SQLite)
为Peewee查询结果添加从1开始的行号
针对你的需求,有两种可行方案:
方案1:SQLite窗口函数实现(数据库层面生成行号)
SQLite 3.25及以上版本支持ROW_NUMBER()窗口函数,可直接在查询中生成从1开始的行号。修改代码如下:
from peewee import fn @staticmethod def getTop(guild:Guild, count) -> list[Ranking]: try: # 追加行号字段,按points降序生成序号 query = (Ranking .select(Ranking, fn.ROW_NUMBER().over(order_by=-Ranking.points).alias('row_number')) .where(Ranking.guild_id == guild.id) .order_by(-Ranking.points) .limit(count)) # 为每个Ranking实例绑定行号属性 result = [] for item in query: item.row_number = item.row_number result.append(item) return result except: return []
注意:需确保SQLite版本≥3.25,若版本过低建议升级。
方案2:Python遍历添加行号
如果不想依赖数据库特性,直接在查询结果返回后通过Python遍历添加行号,兼容性更强:
@staticmethod def getTop(guild:Guild, count) -> list[Ranking]: try: rankings = list(Ranking.select() .where(Ranking.guild_id == guild.id) .order_by(-Ranking.points) .limit(count)) # 从1开始为每条记录添加行号属性 for idx, rank in enumerate(rankings, start=1): rank.row_number = idx return rankings except: return []
两种方案对比:
- 方案1适合需要在SQL查询中使用行号做进一步逻辑处理的场景;
- 方案2更轻量化,无需修改SQL结构,仅用于结果展示时更合适。
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

