Как выбрать литеральные значения в запросе sqlalchemy? - PullRequest
28 голосов
/ 23 сентября 2011

У меня есть запрос, который выглядит так:

query = session.query(Item) \
    .filter(Item.company_id == company_id) \
    .order_by(Item.id)

Это довольно простой запрос.В дополнение к извлечению значений для элемента, я хочу добавить дополнительное значение в набор и вернуть его мне.В сыром SQL я бы сделал это:

SELECT *, 0 as subscribed
FROM items
WHERE company_id = 34
ORDER BY id

Как я могу вручную добавить это значение через sqlalchemy?

Ответы [ 2 ]

50 голосов
/ 25 сентября 2011

Вам нужно будет использовать literal_column, который выглядит примерно так:

sqlalchemy.orm.Query(Item, sqlalchemy.sql.expression.literal_column("0"))

Помните, что аргумент text вставляется в запрос без каких-либопреобразование;это может подвергнуть вас уязвимости SQL-инъекции, если вы примете значения для текстового параметра извне вашего приложения.Если это то, что вам нужно, вы захотите использовать bindparam, что примерно так же просто;но вам придется придумать имя:

sqlalchemy.orm.Query(Item, sqlalchemy.sql.expression.bindparam("zero", 0))
3 голосов
/ 31 октября 2017

Как уже упоминалось в комментариях к принятому ответу, есть "стенография" для bindparam(), которая устраняет необходимость придумывать имя для буквального связующего, literal():

Возвращает литеральное предложение, привязанное к параметру связывания.

Так что не нужно писать

session.query(Item, bindparam("zero", 0).label("subscribed"))

но просто

session.query(Item, literal(0).label("subscribed"))

не нужно беспокоиться о цитировании и т. Д., Если передаются строки или что-то подобное.

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