2016-08-23 3 views
1

Название в значительной степени подводит итог: я хотел бы указать, появляются ли значения 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 сделать это? Если нет, есть ли лучшее обходное решение, чем я думал?

ответ

0

Я думаю, что вы слишком усложняете проблему, если честно.

Варианты:

MyModel.select().order_by(Clause(MyModel.field.desc(), SQL('NULLS LAST'))) 

MyModel.select().order_by(SQL('field DESC NULLS LAST')) 

Вы можете также использовать случай заявление, чтобы создать не сглаженный колонку, содержащую 1 или 0, чтобы указать, является ли столбец вы сортировкой равно нулю. Затем используйте этот псевдоним в порядке.

+0

спасибо, не поняла, что смогу это сделать. Для справок в будущем: второй вариант сложный при выполнении соединения (как и я), потому что вам нужно знать, какой псевдоним таблицы используется, если вам нужно заказать по общему имени столбца. Первый вариант работал отлично (после того, как я понял, что я не должен помещать дополнительные ссылки столбца в одно и то же предложение!). – ASL