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 是 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
放入子 select 的 from 子句中,而是从周围的 select 中取出它].
您可能需要也可能不需要在子查询上使用 alias
或 scalar
,我不记得了。不过,总体思路应该成立。
我在 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 是 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
放入子 select 的 from 子句中,而是从周围的 select 中取出它].
您可能需要也可能不需要在子查询上使用 alias
或 scalar
,我不记得了。不过,总体思路应该成立。