[英]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()
返回一个int
或long
而不是子查询。
为了做你想要做的事,你必须这样做
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中取出它。
您可能会或可能不会在子查询中使用alias
或scalar
,我不记得了。 一般的想法应该成立。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.