我有一个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;
我成功地写了sqlalchemy equvalent
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()
但我想避免在func.count(Table1.field1)
子句中使用order_by
。
如何在sqlalchemy中使用别名?任何人都可以展示任何一个例子吗?
答案 0 :(得分:1)
别名用于表格;查询中的列将被赋予标签。这也让我不时上瘾。
你可以采取这两种方式。将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()
生成的SQL仍然与您自己的代码生成的相同,但至少您不必键入func.count()
两次调用。
要为此列指定显式标签,请调用其上的.label()
method:
field1_count = func.count(Table1.field1).label('c')
然后您可以在order_by
子句中使用相同的标签 string :
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()
或者您可以使用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()
答案 1 :(得分:0)
还可以使用c这是列属性的别名,但在这种情况下,标签可以正常工作。
还会指出过滤器不需要多次使用就可以通过逗号分隔标准。
result = (session.query(Table1.field1, Table1.field2,
func.count(Table1.field1).label('total'))
.filter(Table1.c.user_id == self.user_id, Table1.timestamp > self.from_ts)
.group_by(Table1.field1,Table1.field2)
.order_by(desc('total')).first())