sqlalchemy中的子查询顺序

Subquery in order by in sqlalchemy

我在 sqlalchemy 查询方面需要一些帮助。 我在 sqlalchemy 中实现此 mysql 查询时遇到问题。

MySQL 查询:

select u.post_id
from
    user_record_cards u
where
    u.record_card_id = 1 and u.count = 1
order by (select 
        count(*)
    from
        post_likes p
    where
        p.post = u.post_id)

我的 sqlalchemy 查询是:

obj = (
    UserRecordCard.query
    .filter(
        UserRecordCard.record_card_id == 1,
        UserRecordCard.count == 1
    ).order_by(
        Like.query.filter(
            Like.post == UserRecordCard.post_id
        ).count()
    ).all()
)

我的回溯是:

Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/sql/elements.py", line 3453, in _literal_as_text
    "SQL expression object or string expected."
ArgumentError: SQL expression object or string expected.

您的问题是 .count() returns 是 intlong 而不是子查询。

为了完成您打算做的事情,您必须像这样

from sqlalchemy import select, func

obj = (
    UserRecordCard.query
    .filter(
       UserRecordCard.record_card_id == 1,
       UserRecordCard.count == 1
    )
    .order_by(
        select([
            func.count()
        ])
        .select_from(Like.__table__)
        .where(Like.post == UserRecordCard.post_id)
        .correlate(UserRecordCard.__table__)
    )
)

correlate() 调用告诉 SQLAlchemy 不要尝试将 UserRecordCard 放入子 select 的 from 子句中,而是从周围的 select 中取出它].

您可能需要也可能不需要在子查询上使用 aliasscalar,我不记得了。不过,总体思路应该成立。