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

Python 如何在sqlalchemy查询中选择文字值?,python,sqlalchemy,Python,Sqlalchemy,我有一个查询,如下所示: query = session.query(Item) \ .filter(Item.company_id == company_id) \ .order_by(Item.id) sqlalchemy.orm.Query(Item, sqlalchemy.sql.expression.literal_column("0")) 这是一个非常基本的查询。除了提取项目的值之外,我还想在混合中添加一个附加值,并将其返回给我。在原始SQL中,我将执行以下操作:

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

query = session.query(Item) \
    .filter(Item.company_id == company_id) \
    .order_by(Item.id)
sqlalchemy.orm.Query(Item, sqlalchemy.sql.expression.literal_column("0"))
这是一个非常基本的查询。除了提取项目的值之外,我还想在混合中添加一个附加值,并将其返回给我。在原始SQL中,我将执行以下操作:

SELECT *, 0 as subscribed
FROM items
WHERE company_id = 34
ORDER BY id
如何通过sqlalchemy手动添加该值?

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

query = session.query(Item) \
    .filter(Item.company_id == company_id) \
    .order_by(Item.id)
sqlalchemy.orm.Query(Item, sqlalchemy.sql.expression.literal_column("0"))
注意,
text
参数插入查询时没有任何转换;如果您从应用程序外部接受文本参数的值,这可能会使您面临SQL注入漏洞。如果这是你需要的东西,你会想使用,这是一样容易使用;但你必须发明一个名字:

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

正如在已接受答案的评论中所提到的,有一个“速记”可以减轻为文本bindparam命名的需要:

返回绑定到绑定参数的文本子句

因此,人们不必写作

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

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

如果传递字符串或诸如此类的内容,则无需担心引用等问题。

非常感谢。为了防止有人发现这个问题,对文本列的命名是这样的:
literal\u column(“0”)。label(col\u name)
我发现,对于字符串常量,使用比使用
bindparam
更简洁易读。记住,在选择文本字符串时,将值放在单引号中。例如,
literal\u列(“'my\u string')
(至少对于Postgres)
sqlalchemy.sql.expression.literal
似乎也适用于其他类型,例如
int
。我注意到它也可以作为
sqlalchemy.sql.literal
sqlalchemy.literal
,或者至少在版本1.1.0b2上是这样的