如何在SQLAlchemy中使用别名

3 投票
2 回答
5807 浏览
提问于 2025-04-17 18:48

我有一个这样的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代码:

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

但是我想在order_by这个部分避免使用func.count(Table1.field1)

我该如何在SQLAlchemy中使用别名?有没有人能给我举个例子?

2 个回答

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

别名是用来给表起名字的;而在查询中,列是用标签来标识的。这点我有时候也会搞混。

你可以用两种方法来处理这个问题。首先,把 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() 方法

field1_count = func.count(Table1.field1).label('c')

然后你可以在 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()

或者你也可以使用 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()

撰写回答