繁体   English   中英

在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()返回一个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放入子选择的from子句中,而是从周围的select中取出它。

您可能会或可能不会在子查询中使用aliasscalar ,我不记得了。 一般的想法应该成立。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM