Возьмем пример из этой тривиальной таблицы:
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())
Не знаю, что делать попробуй дальше ...