如何在sqlalchemy查询中选择字面值?

72 投票
2 回答
57901 浏览
提问于 2025-04-17 02:57

我有一个查询,看起来是这样的:

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 个回答

26

在接受的答案的评论中提到,有一种“简写”方式可以用来代替bindparam(),这样就不需要为这个字面量的绑定参数想名字了,使用literal()就可以了:

返回一个字面量子句,绑定到一个绑定参数上。

所以你不需要写

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

而只需要写

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

这样就不用担心引号等问题了,特别是当你传递字符串或类似的内容时。

104

你需要使用一个叫做 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))

撰写回答