Как выбрать литеральные значения в запросе sqlalchemy?
У меня есть запрос, который выглядит так:
query = session.query(Item) \
.filter(Item.company_id == company_id) \
.order_by(Item.id)
Это довольно простой запрос. В дополнение к выделению значений для Item, я хочу добавить дополнительное значение в микс и вернуть его мне. В сыром SQL я бы сделал следующее:
SELECT *, 0 as subscribed
FROM items
WHERE company_id = 34
ORDER BY id
Как я могу вручную добавить это значение через sqlalchemy?
Ответы
Ответ 1
Вам понадобится literal_column
, который выглядит примерно так:
sqlalchemy.orm.Query(Item, sqlalchemy.sql.expression.literal_column("0"))
Помните, что аргумент text
вставляется в запрос без какого-либо преобразования; это может привести к уязвимости SQL Injection, если вы принимаете значения для текстового параметра вне приложения. Если вам что-то понадобится, вы захотите использовать bindparam
, который примерно такой же прост в использовании; но вам придется придумать имя:
sqlalchemy.orm.Query(Item, sqlalchemy.sql.expression.bindparam("zero", 0))
Ответ 2
Как упоминалось в комментариях принятого ответа, существует "стенография" для bindparam()
, которая устраняет необходимость придумать имя для литерала bindparam, literal()
:
Возвращает предложение literal, связанное с параметром bind.
Таким образом, не нужно писать
session.query(Item, bindparam("zero", 0).label("subscribed"))
но просто
session.query(Item, literal(0).label("subscribed"))
не беспокоясь о цитировании и т.д., если передаете строки или такие.