如何在sqlalchemy查询中选择字面值?
我有一个查询,看起来是这样的:
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))