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

时间:2011-09-23 18:12:03

标签: python 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手动添加该值?

2 个答案:

答案 0 :(得分:49)

您需要使用literal_column,看起来有点像这样:

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

请注意text参数插入到查询中而不进行任何转换;如果您从应用程序外部接受text参数的值,这可能会使您遇到SQL注入漏洞。如果这是你需要的东西,你会想要使用bindparam,这很容易使用;但你必须发明一个名字:

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

答案 1 :(得分:3)

正如在接受的答案的评论中提到的那样,"简写" for bindparam()减少了为文字绑定参数设置名称的需要,literal()

  

返回绑定到绑定参数的文字子句。

所以一个人不必写

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

但只是

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

无需担心引用等,如果传递字符串等。