python - 在 SQLAlchemy 中按子查询排序

标签 python mysql sqlalchemy flask-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

看起来很像你的查询

关于python - 在 SQLAlchemy 中按子查询排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17516672/

相关文章:

python - turtle 图形脚本在代码运行时不断崩溃

mysql - SQL从其他表获取空字段

php - 计算一列中有多少行具有特殊值

python - Flask-Sqlalchemy + Sqlalchemy-searchable 返回空列表

python - 从 SQLAlchemy 中的另一列创建一列

flask - 如何使用 SQlAlchemy 声明方式插入数据

python - 使用Python将字数统计文件转换为稀疏矩阵

Python 我无法替换我的字符串值

python - 使用动态鼠标悬停事件抓取网站

php - SQLSTATE[HY000] : General error: 1364 Field 'author_id' doesn't have a default value