如何在sqlachemy中使用alias

2024-10-01 13:40:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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等式

^{pr2}$

但是我想避免在order_by子句中使用func.count(Table1.field1)。在

如何在sqlalchemy中使用alias?有谁能举个例子吗?在


Tags: fromidsqlbysqlalchemyascountorder
2条回答

别名用于表;查询中的列被赋予标签。这也时常让我绊倒。在

你可以从两个方面着手。先将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仍然与您自己的代码生成的SQL相同,但至少您不必输入两次func.count()调用。在

要给此列指定一个显式标签,请对其调用^{} method

^{pr2}$

然后您可以在order_by子句中使用相同的labelstring

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()

也可以使用c,这是column属性的别名,但在这种情况下,标签可以正常工作。在

还将指出,过滤器不需要多次使用就可以通过逗号分隔的标准。在

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())

相关问题 更多 >