3

次のような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()

func.count(Table1.field1)しかし、order_by節での使用は避けたいです。

sqlalchemy でエイリアスを使用するにはどうすればよいですか? 誰でも例を示すことができますか?

4

2 に答える 2

6

エイリアスはテーブル用です。クエリの列には、代わりにラベルが付けられます。これも時々私をつまずかせます。

これには 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 は、独自のコードが生成するものと同じですが、少なくともfunc.count()呼び出しを 2 回入力する必要はありません。

この列に明示的なラベルを付けるには、次の.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()
于 2013-03-12T13:48:56.017 に答える