我有一个 sql 查询如下
select cloumn1,column2,count(column1) as c
from Table1 where user_id='xxxxx' and timestamp > xxxxxx
group by cloumn1,column2
order by c desc limit 1;
Run Code Online (Sandbox Code Playgroud)
我成功地编写了 sqlalchemy 等效项
result = session.query(Table1.field1,Table1.field2,func.count(Table1.field1)).filter(
Table1.user_id == self.user_id).filter(Table1.timestamp > self.from_ts).group_by(
Table1.field1,Travelog.field2).order_by(desc(func.count(Table1.field1))).first()
Run Code Online (Sandbox Code Playgroud)
但我想避免func.count(Table1.field1)在order_by子句中使用。
如何在 sqlalchemy 中使用别名?任何人都可以举出任何例子吗?
别名用于表;查询中的列被赋予一个标签。这也时不时地让我绊倒。
你可以通过两种方式解决这个问题。首先将func.count()结果存储为局部变量并重用它就足够了:
field1_count = func.count(Table1.field1)
result = session.query(Table1.field1, Table1.field2, field1_count).filter(
Table1.user_id == self.user_id).filter(Table1.timestamp > self.from_ts).group_by(
Table1.field1, Travelog.field2).order_by(desc(field1_count)).first()
Run Code Online (Sandbox Code Playgroud)
生成的 SQL 仍将与您自己的代码生成的相同,但至少您不必键入func.count()两次调用。
要给这个列一个明确的标签,调用它的.label()方法:
field1_count = func.count(Table1.field1).label('c')
Run Code Online (Sandbox Code Playgroud)
然后您可以在子句中使用相同的标签字符串order_by:
result = session.query(Table1.field1, Table1.field2, field1_count).filter(
Table1.user_id == self.user_id).filter(Table1.timestamp > self.from_ts).group_by(
Table1.field1, Travelog.field2).order_by(desc('c')).first()
Run Code Online (Sandbox Code Playgroud)
或者您可以使用该field1_count.name属性:
result = session.query(Table1.field1, Table1.field2, field1_count).filter(
Table1.user_id == self.user_id).filter(Table1.timestamp > self.from_ts).group_by(
Table1.field1, Travelog.field2).order_by(desc(field1_count.name)).first()
Run Code Online (Sandbox Code Playgroud)