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)
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)
如果传递字符串等,则不必担心引用等。