Peewee:怎么做 ORDER BY ... NULLS (FIRST|LAST)?
Peewee: how to do ORDER BY ... NULLS (FIRST|LAST)?
标题几乎概括了它:我想指定空值是出现在我的结果中的第一个还是最后一个。在我的具体情况下,我想以降序排序最后得到空值,对应于 SQL ,如下所示:
SELECT id, something, something_else
FROM mytable
ORDER BY something DESC NULLS FIRST;
这是 PostgreSQL 语法(这是我在这个项目中使用的语法)。同样的问题可能适用于其他数据库(尽管我认为 MySQL 不支持该语法,不确定它是否支持该功能)。当然,首先是空值是升序的默认值 (see PostgreSQL docs), so only the combinations DESC NULLS FIRST and ASC NULLS LAST are likely to be useful...except that, conveniently, the MySQL default is precisely the opposite.
看来我应该可以做到以下其中一项:
MyModel.select().order_by(MyModel.something.desc().nulls_first())
MyModel.select().order_by(MyModel.something.desc(nulls_first))
我不是 Python 大师,但我在 Peewee 文档或源代码中找不到任何看起来像我想要的东西。
当然可能有很多解决方法。以下是我发现或想到的,按实用性降序排列(对我而言):
- 使用原始 SQL(这在我的情况下实际上可行,但如果我以后需要 objects 就不是那么好)
- 通过按其他方式排序(例如函数,我也不确定如何使用 Peewee,或者按照 this 添加派生列)来伪造它
- 也许使用 UNION 来组合具有 WHERE ?? 的查询IS NOT NULL with one where ?? IS NULL ...但这在几个方面似乎有问题,例如我不知道 Peewee 是否也可以做到这一点,而且最好还是在整个事情上做 ORDER BY
- 运行 两个单独的查询并将它们的结果集放在一起 Python ... 再次,我认为这听起来很麻烦(额外的开销,需要 1 个事务来保证数据完整性)
- 重新设计架构,这样我就不必按可能为空的内容进行排序(也许有一天……)
那么:Peewee 能做到吗?如果没有,是否有比我想到的更好的解决方法?
老实说,我认为你把问题复杂化了。
从 Peewee 3.x 开始,您可以指定对空值的处理:
MyModel.select().order_by(MyModel.something.desc(nulls='LAST'))
您还可以使用 case 语句创建一个包含 1 或 0 的别名列,以指示您正在排序的列是否为空。然后按顺序使用该别名。
标题几乎概括了它:我想指定空值是出现在我的结果中的第一个还是最后一个。在我的具体情况下,我想以降序排序最后得到空值,对应于 SQL ,如下所示:
SELECT id, something, something_else
FROM mytable
ORDER BY something DESC NULLS FIRST;
这是 PostgreSQL 语法(这是我在这个项目中使用的语法)。同样的问题可能适用于其他数据库(尽管我认为 MySQL 不支持该语法,不确定它是否支持该功能)。当然,首先是空值是升序的默认值 (see PostgreSQL docs), so only the combinations DESC NULLS FIRST and ASC NULLS LAST are likely to be useful...except that, conveniently, the MySQL default is precisely the opposite.
看来我应该可以做到以下其中一项:
MyModel.select().order_by(MyModel.something.desc().nulls_first())
MyModel.select().order_by(MyModel.something.desc(nulls_first))
我不是 Python 大师,但我在 Peewee 文档或源代码中找不到任何看起来像我想要的东西。
当然可能有很多解决方法。以下是我发现或想到的,按实用性降序排列(对我而言):
- 使用原始 SQL(这在我的情况下实际上可行,但如果我以后需要 objects 就不是那么好)
- 通过按其他方式排序(例如函数,我也不确定如何使用 Peewee,或者按照 this 添加派生列)来伪造它
- 也许使用 UNION 来组合具有 WHERE ?? 的查询IS NOT NULL with one where ?? IS NULL ...但这在几个方面似乎有问题,例如我不知道 Peewee 是否也可以做到这一点,而且最好还是在整个事情上做 ORDER BY
- 运行 两个单独的查询并将它们的结果集放在一起 Python ... 再次,我认为这听起来很麻烦(额外的开销,需要 1 个事务来保证数据完整性)
- 重新设计架构,这样我就不必按可能为空的内容进行排序(也许有一天……)
那么:Peewee 能做到吗?如果没有,是否有比我想到的更好的解决方法?
老实说,我认为你把问题复杂化了。
从 Peewee 3.x 开始,您可以指定对空值的处理:
MyModel.select().order_by(MyModel.something.desc(nulls='LAST'))
您还可以使用 case 语句创建一个包含 1 或 0 的别名列,以指示您正在排序的列是否为空。然后按顺序使用该别名。