【问题标题】:order_by() method not working in peeweeorder_by() 方法在 peewee 中不起作用
【发布时间】:2015-01-31 18:43:43
【问题描述】:

我正在使用带有简单节目 - 季 - 集模式的 SQLite 后端:

class Show(BaseModel):
    name = CharField()

class Season(BaseModel):
    show = ForeignKeyField(Show, related_name='seasons')
    season_number = IntegerField()

class Episode(BaseModel):
    season = ForeignKeyField(Season, related_name='episodes')
    episode_number = IntegerField()

我需要以下查询:

seasons = (Season.select(Season, Episode)
       .join(Episode)
       .where(Season.show == SHOW_ID)
       .order_by(Season.season_number.desc(), Episode.episode_number.desc())
       .aggregate_rows())

SHOW_ID 是我想要季节列表的节目的 ID。 但是当我使用以下代码遍历查询时:

for season in seasons:
    for episode in season.episodes:
        print(episode.episode_number)

...我得到了一些根本没有排序的东西,甚至没有遵循不使用 order_by() 得到的顺序,即插入顺序。

我激活了调试日志以查看传出查询,并且该查询确实包含 ORDER BY 子句,并且手动应用它会返回正确的降序。

我是 peewee 的新手,我见过很多使用 join() 与 order_by() 组合的示例,但我仍然无法找出我做错了什么。

【问题讨论】:

    标签: orm peewee


    【解决方案1】:

    这是由于聚合查询结果包装器中嵌套集合的处理存在错误。

    github问题是:https://github.com/coleifer/peewee/issues/519

    修复已在此处合并:https://github.com/coleifer/peewee/commit/ec0e87f1a480695d98bf1f0d7f2e63aed8dfc440

    因此,要获得修复,您需要克隆 master 或等到下一个版本,下一个版本应该在下一周或两周内 (2.4.7)。

    【讨论】:

    • 我刚刚在没有 aggregate_rows() 的情况下进行了测试,它仍然没有排序。
    • 是的,如果没有aggregate_rows(),情况会有所不同——我假设您正在迭代season.episodes?如果是这样,您将遇到“N+1”查询问题。
    • 是的,删除 aggregate_rows() 结果为重复但仍未排序,这意味着排序问题不是来自聚合,如果我错了,请纠正我。
    猜你喜欢
    • 2017-03-24
    • 2016-12-17
    • 2014-07-10
    • 2019-08-06
    • 1970-01-01
    • 2020-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多