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

Ger*_*ult 31 python sqlalchemy

我有一个查询,如下所示:

query = session.query(Item) \
    .filter(Item.company_id == company_id) \
    .order_by(Item.id)
Run Code Online (Sandbox Code Playgroud)

这是一个非常基本的查询.除了拉出Item的值之外,我想在混合中添加一个额外的值,并将它返回给我.在原始SQL中,我会这样做:

SELECT *, 0 as subscribed
FROM items
WHERE company_id = 34
ORDER BY id
Run Code Online (Sandbox Code Playgroud)

如何通过sqlalchemy手动添加该值?

Sin*_*ion 55

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

sqlalchemy.orm.Query(Item, sqlalchemy.sql.expression.literal_column("0"))
Run Code Online (Sandbox Code Playgroud)

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

sqlalchemy.orm.Query(Item, sqlalchemy.sql.expression.bindparam("zero", 0))
Run Code Online (Sandbox Code Playgroud)

  • 邪恶,谢谢你.并且万一有人发现这个问题,命名文字列就像这样:`literal_column("0").label(col_name)` (13认同)
  • 请记住,在选择文字字符串时,请将值放在单引号中.例如,`literal_column("'my_string'")`(至少对于Postgres) (6认同)
  • `sqlalchemy.sql.expression.literal`似乎也适用于其他类型,例如`int`.我注意到它也可以作为`sqlalchemy.sql.literal`或`sqlalchemy.literal`,或者至少在版本1.1.0b2上可用. (3认同)
  • 我发现使用[`sqlalchemy.sql.expression.literal`](http://docs.sqlalchemy.org/en/latest/core/sqlelement.html#sqlalchemy.sql.expression.literal)更多一点字符串常量比`bindparam`简洁可读. (2认同)
  • 从 sqlalchemy 导入literal_column (2认同)

Ilj*_*ilä 18

正如已接受答案的评论中所提到的,有一个“速记”bindparam()可以减轻为文字 bindparam 想出一个名称的需要literal()

返回一个文字子句,绑定到一个绑定参数。

所以一个人不必写

session.query(Item, bindparam("zero", 0).label("subscribed"))
Run Code Online (Sandbox Code Playgroud)

只是

session.query(Item, literal(0).label("subscribed"))
Run Code Online (Sandbox Code Playgroud)

如果传递字符串等,则不必担心引用等。