Есть ли способ получить NULLS LAST как функциональность с SQLAlchemy и MariaDB? - PullRequest
0 голосов
/ 13 марта 2020

Возьмем пример из этой тривиальной таблицы:

CREATE TABLE `example` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `enabled` tinyint(1) NOT NULL DEFAULT '1',
  `priority` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`));

Я хочу использовать SQLAlchemy для извлечения всех включенных объектов, начиная с наименьшего числа (с наивысшим приоритетом) и заканчивая нулями.

Согласно это сообщение StackOverflow Я должен быть в состоянии сделать это:

session.query(Example).filter_by(enabled=True).order_by(Example.priority.asc().nullslast())

Но это вызывает следующее исключение:

sqlalchemy.exc.ProgrammingError: (MySQLdb._exceptions.ProgrammingError) (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'NULLS LAST' at line 3")

Сгенерированный SQL заканчивается так, который выглядит неверным:

WHERE example.enabled = true ORDER BY example.priority DESC NULLS LAST

Перебираясь в консоли MariaDB, оба эти запроса дают мне то, что я хочу:

SELECT id FROM example WHERE enabled = TRUE ORDER BY priority IS NULL, priority ASC;
SELECT id FROM patches WHERE enabled = TRUE ORDER BY -priority DESC;

Но я не могу понять, как на самом деле сделать SQLAlchemy генерирует мне любой из них, просматривая документы.

Это близко, но все равно вызывает ошибку SQL:

session.query(Example).filter_by(enabled=True).order_by(Example.priority.nullslast(), Example.priority.asc())
... WHERE example.enabled = true ORDER BY example.priority NULLS LAST, example.priority ASC

Если бы я мог заменить NULLS LAST на IS NULL это будет работать, но .isnull() - это не вещь.

Это не вызывает ошибку SQL, но все равно ставит нулевые значения на первое место:

session.query(Example).filter_by(enabled=True).order_by(Example.priority.isnot(None), Example.priority.asc()) 

Не знаю, что делать попробуй дальше ...

1 Ответ

0 голосов
/ 13 марта 2020

Попробуйте использовать оператор sqlalchemy .is_():

session.query(Example).filter_by(enabled=True).order_by(Example.priority.is_(None),
                                                        Example.priority.asc())

В качестве альтернативы вы можете использовать Example.priority == None.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...