数据库
首页 > 数据库> > python-在SQLAlchemy中按子查询排序

python-在SQLAlchemy中按子查询排序

作者:互联网

我正在尝试选择最新的线程(Thread),这些线程按对它们的最新答复的时间降序排列(答复是Post模型,这是标准的论坛查询).在SQL中,我会这样写:

SELECT * FROM thread AS t ORDER BY (SELECT MAX(posted_at) FROM post WHERE thread_id = t.id) DESC

我该如何在SQLAlchemy中进行此类操作?我尝试过这样的事情:

scalar = db.select[func.max(Post.posted_at)].where(Post.thread_id == Thread.id).as_scalar()
threads = Thread.query.order_by(scalar.desc()).all()

但是似乎我不理解标量是如何工作的.第5次阅读文档无济于事.有人可以帮我在SQLAlchemy中编写这样的查询吗?我为此应用程序使用flask-sqlalchemy和MySQL.

解决方法:

对我来说很好,这是一个测试:

from sqlalchemy import *
from sqlalchemy.orm import *
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class Thread(Base):
    __tablename__ = 'thread'

    id = Column(Integer, primary_key=True)


class Post(Base):
    __tablename__ = 'post'

    id = Column(Integer, primary_key=True)
    thread_id = Column(Integer, ForeignKey('thread.id'))
    posted_at = Column(String)

s = Session()

scalar = select([func.max(Post.posted_at)]).where(Post.thread_id == Thread.id).as_scalar()

q = s.query(Thread).order_by(scalar.desc())

print q

输出(注意,我们只是在这里打印SQL):

SELECT thread.id AS thread_id 
FROM thread ORDER BY (SELECT max(post.posted_at) AS max_1 
FROM post 
WHERE post.thread_id = thread.id) DESC

看起来很像您的查询

标签:sqlalchemy,flask-sqlalchemy,python,mysql
来源: https://codeday.me/bug/20191123/2064738.html