SQLAlchemy从子查询中选择并按子查询字段排序

时间:2017-07-29 05:03:54

标签: python postgresql orm sqlalchemy flask-sqlalchemy

我在jsonb字段中有一个带有推文的数据库表。 我有一个查询,以获得最转推的订阅推文,这就是它的样子:

SELECT * FROM (
   SELECT DISTINCT ON (raw->'retweeted_status'->'id_str')
     raw->'retweeted_status' as status,
     raw->'retweeted_status'->'retweet_count' as cnt
   FROM tweet
   WHERE (raw->'retweeted_status') is not null
   ORDER BY raw->'retweeted_status'->'id_str', cnt DESC
) t
ORDER BY cnt DESC

我正在尝试使用sqlalchemy创建此查询,这是我到目前为止的地方:

session.query(Tweet.raw['retweeted_status'], 
         Tweet.raw['retweeted_status']['retweet_count'].label('cnt'))\
        .filter(~Tweet.raw.has_key('retweeted_status'))\
        .distinct(Tweet.raw['retweeted_status']['id_str']).order_by(Tweet.raw['retweeted_status']['id_str'].desc()).subquery()

但是如何通过cnt从那里开始订购?

1 个答案:

答案 0 :(得分:0)

它可能无法生成您显示的确切查询,但应指向正确的方向:您可以在'cnt'中使用标记order_by,例如:.order_by('cnt')

此外,您可以将标签用作sqlalchemy.desc函数的参数。总结:

from sqlalchemy import desc

q = (
    session.query(
        Tweet.raw['retweeted_status'],
        Tweet.raw['retweeted_status']['retweet_count'].label('cnt')
    )
    .filter(~Tweet.raw.has_key('retweeted_status'))
    .distinct(
        Tweet.raw['retweeted_status']['id_str']
    )
    .order_by(desc('cnt'))
).subquery()

其他提示:如果将其放在括号中,可以很好地格式化查询。

您也可以在python sqlalchemy label usage上阅读一般问题的答案。