#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:
Есть несколько вещей, которые вы можете сделать.
С головы до ног…
- Если вы просто хотите отобразить что-то, вы можете использовать декоратор свойств:
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
- Если вы хотите отображать / принимать строки и прозрачно конвертировать sqlalchemy из string / int, вы можете использовать TypeDecorator — http://docs.sqlalchemy.org/en/rel_0_9/core/types.html#custom-types
Лично я обычно выбираю декоратор свойств.