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上是这样的