Название в значительной степени подводит итог: я хотел бы указать, появляются ли значения null или last в моих результатах. В моем конкретном случае, я хочу, чтобы получить аннулирует последнюю с порядком сортировки нисходящим, соответствующий SQL так:Peewee: как сделать ORDER BY ... NULLS (FIRST | LAST)?
SELECT id, something, something_else
FROM mytable
ORDER BY something DESC NULLS FIRST;
Это синтаксис PostgreSQL (который является то, что я использую для этого проекта). Та же проблема может быть применима и к другим базам данных (хотя я не думаю, что MySQL поддерживает этот синтаксис, не уверен, поддерживает ли он эту функцию). Конечно, наличие аннулирует первый по умолчанию для возрастающего порядка (see PostgreSQL docs), поэтому только комбинация DESC NULLS FIRST и ASC NULLS LAST, вероятно, будет полезно ... кроме того, что удобно, то MySQL по умолчанию precisely the opposite.
Похоже, я должен быть в состоянии сделать один из них:
MyModel.select().order_by(MyModel.something.desc().nulls_first())
MyModel.select().order_by(MyModel.something.desc(nulls_first))
Я не Python гуру, но я не мог найти что-либо в документации или исходный код Peewee, который выглядит, как он будет делать то, что я хочу.
Конечно, может быть много обходных решений. Вот те, которые я нашел, или мысль о том, в порядке убывания практичности (для меня):
- с использованием сырого SQL (который может реально работать в моем случае, но не так велик, если мне нужны объекты позже)
- притворяется, заказав что-то еще (например, функции, которые я не уверен, как это сделать с Peewee либо, или добавление производный столбец вдоль линий this)
- возможно с помощью UNION, чтобы комбинировать запрос с ГДЕ? IS NOT NULL с одним ГДЕ? IS NULL ... но это кажется проблематичным на нескольких фронтах, например, я не знаю, может ли Peewee это сделать, и все равно было бы лучше сделать ORDER BY на все это в любом случае
- работает с двумя отдельными запросами и ставя их результирующие наборы вместе в Python ... опять же, звучит как проблема, я думаю (дополнительные накладные расходы, нужна 1 транзакция для целостности данных)
- перепроектируйте схему, поэтому мне не нужно заказывать что-то, что может быть нулевым (возможно, когда-нибудь ...)
Итак: может Peewee сделать это? Если нет, есть ли лучшее обходное решение, чем я думал?
спасибо, не поняла, что смогу это сделать. Для справок в будущем: второй вариант сложный при выполнении соединения (как и я), потому что вам нужно знать, какой псевдоним таблицы используется, если вам нужно заказать по общему имени столбца. Первый вариант работал отлично (после того, как я понял, что я не должен помещать дополнительные ссылки столбца в одно и то же предложение!). – ASL