SQLAlchemy: выполнить / добавить функцию в столбец в sqlalchemy

#python #postgresql #sqlalchemy

#python #postgresql #sqlalchemy

Вопрос:

Я использую SQLAlchemy, и у меня есть запрос, из которого один из столбцов, которые я получаю, является константой QUOTE_STATUS_ERROR, значения в этом столбце являются целыми числами. Поскольку постоянное значение ничего не значит для конечного пользователя, я хотел бы преобразовать это значение из самого запроса, чтобы отобразить строку, сопоставив значения этого столбца со словарем, который у меня есть в приложении, используя функцию, которая у меня уже есть для этой цели. Я не смог найти способ ее реализации, поскольку столбцы в запросе являются объектом, а не значением самого столбца. Чтобы прояснить мой вопрос, это пример того, что у меня есть:

Запрос:

 q = meta.session.query(MyModel.id, MyModel.quote_status).join(AnotherModel).subquery("q")
 

Функция, которую я хочу использовать:

 def get_status_names(status_value):
    return QUOTE_STATUS_NAMES[status_value]
 

Есть ли способ сделать это непосредственно из SQLAlchemy, присоединив / передав функцию (get_status_names()) к столбцу (MyModel.quote_status). Если нет, то какой может быть лучший подход? Я предпочитаю не перебирать значения после получения результатов, если список результатов является обширным. Я был бы признателен за толчок в правильном направлении.

ОБНОВЛЕНИЕ: я соединяю полученный подзапрос с другими таблицами

Ответ №1:

Есть несколько вещей, которые вы можете сделать.

С головы до ног…

  1. Если вы просто хотите отобразить что-то, вы можете использовать декоратор свойств:

 QUOTE_STATUS__ID_2_NAME = {}

class MyModel(object):
    id = Column()
    quote_status_id = Column()

    @property
    def quote_status_string(self):
        if self.quote_status_id:  
            return QUOTE_STATUS__ID_2_NAME[self.quote_status_id] 
        return None
 

  1. Если вы хотите отображать / принимать строки и прозрачно конвертировать sqlalchemy из string / int, вы можете использовать TypeDecorator — http://docs.sqlalchemy.org/en/rel_0_9/core/types.html#custom-types

Лично я обычно выбираю декоратор свойств.