Подтвердить что ты не робот

Как выбрать литеральные значения в запросе 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?

4b9b3361

Ответ 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"))

не беспокоясь о цитировании и т.д., если передаете строки или такие.