Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用sqlalchemy仅从相关表中选择一行_Python_Sqlalchemy - Fatal编程技术网

Python 使用sqlalchemy仅从相关表中选择一行

Python 使用sqlalchemy仅从相关表中选择一行,python,sqlalchemy,Python,Sqlalchemy,假设我有一个Author表和一个Post表,每个Author可以有几个Post 现在,通过一个sqlalchemy查询,我想获得我所有的活跃作者以及每个作者最近发表的文章 我一直试图通过获取一个加入作者的帖子列表,使用子查询将结果分组在一起,如下所示: subquery = DBSession.query(Author.id, func.max(Post.publish_date).label("publish_date")) \ .join(Post.author) \ .fi

假设我有一个Author表和一个Post表,每个Author可以有几个Post

现在,通过一个sqlalchemy查询,我想获得我所有的活跃作者以及每个作者最近发表的文章

我一直试图通过获取一个加入作者的帖子列表,使用子查询将结果分组在一起,如下所示:

subquery = DBSession.query(Author.id, func.max(Post.publish_date).label("publish_date")) \
    .join(Post.author) \
    .filter(Post.state == 'published') \
    .filter(Author.state == 'active') \
    .group_by(Author.id) \
    .subquery()

query = DBSession.query(Post) \
    .options(joinedload(Post.author)) \
    .join(Post.author) \
    .join(subquery, and_(Author.id == subquery.c.id, 
                         Post.publish_date == subquery.c.publish_date))
但是如果我有两篇发表日期相同的作者的帖子,而这些都是最新的帖子,这意味着我会让那个作者在我的结果列表中出现两次。虽然我可以使用第二个子查询来消除重复(以func.max(Post.id))为例,但这似乎是一个非常非常错误的方法。有没有更好的办法


(同样,我在寻找一个查询,因此我试图避免在Author表上查询,然后循环并对结果中的每个作者进行Post查询。)

我将按照以下方式执行:

LastPost = aliased(Post, name='last')
last_id = (
    session.query(LastPost.id)
    .filter(LastPost.author_id == Author.id)
    .order_by(LastPost.publish_date.desc())
    .order_by(LastPost.id.desc())
    .limit(1)
    .correlate(Author)
    .as_scalar()
)

query = (
    DBSession.query(Author, Post)
    .outerjoin(Post, Post.id == last_id)
)

for author, last_post in query:
    print(author, last_post)
如您所见,结果是成对的
(作者,LastPost)

如果您只希望作者至少有一位
Post
,请将
outerjoin
更改为
join


此外,我不预加载任何关系
Author.post
,以避免任何混淆。

如果我要添加ORDER BY子句,我想做我想做的事情,但我不知道如何将其从SQL转换为sqlalchemy。如果您的db支持带有over子句的窗口函数,您可以使用Note:
as\u scalar()
在sqlalchemy 1.4中被弃用,并被
scalar\u subquery()
取代(请参阅文档:)