2013-03-12 56 views
1

如何我有一個SQL查詢,如下所示使用別名sqlachemy

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; 

我successed在寫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中使用別名?任何人都可以顯示任何示例嗎?

回答

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子句中:

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