Как отсортировать таблицу sqlalchemy с функцией python? - PullRequest
0 голосов
/ 24 февраля 2020

У меня есть таблица с уравнением столбца, в этом столбце я храню математическое уравнение типа x+12-25+z**2, x*z-12, et c. для каждой строки это разное уравнение, и я хочу отсортировать свою таблицу по выходным данным уравнения. X и Z - некоторые python переменные, вы можете думать о них как numpy.array. Переменные обновляются каждые 15-30 минут.
Моя таблица выглядит следующим образом

class Table(Base):
   ....
   equation = Column(String(1024))

Я вычисляю уравнения в python по моей функции calculate_equation(string), она заботится о размещении всех переменных и выполнении математических операций, а также возвращает только 1 число.
Я пытался с hybrid_property, который выглядит следующим образом:

@hybrid_property
def equation_value(self):
   return calculate_equation(self.equation)

И сортировать его с помощью:

session.query(Table).order_by(Table.equation_value).all()

Но он выдает ошибки. Любые советы, как это сделать? Это даже правильно? Должен ли я использовать другой механизм хранения данных?
Предложения приветствуются.

1 Ответ

1 голос
/ 26 февраля 2020

Метод .order_by() вызывает предложение SQL ORDER BY; поэтому вещь, которую вы упорядочиваете, должна быть выражением SQL, а не произвольной python функцией. Просто пометить метод с помощью @hybrid_property недостаточно - вам также нужно реализовать @equation_value.expression в качестве выражения sqlalchemy.

У вас есть два варианта:

  • Реализация вашего calculate_equation функция в SQL (или как выражение sqlalchemy / гибридный объект), которая позволит вам использовать его в предложении ORDER BY. Из вашего описания это, вероятно, очень сложно.
  • Просто запросите все и затем выполните сортировку в памяти:
sorted(session.query(Table).all(), key=calculate_equation)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...