You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SQLAlchemy中按datetime类型字段排序获取最新条目

问题原因

你遇到的报错核心原因是:order_by方法要求传入SQL表达式(通常是模型类的字段对象),但你实际传入的是一个具体的datetime类型值。
触发这个问题的两个常见命名混淆点:

  • 你在desc()中传入的db.content_entered不是模型类的字段,而是某条已存在的数据实例的content_entered属性值,属于具体的时间数据,不能用作排序规则。
  • 不要用单条数据实例去调用query属性,query是模型类的类属性,不属于单个数据实例。

解决方法

首先要明确区分三类对象的命名,避免混淆:

  1. db:固定为SQLAlchemy实例,不要用作模型类、数据实例的变量名
  2. 模型类:用大驼峰命名(如Post、DatabaseRecord),对应数据库的整张表
  3. 单条数据实例:用小写蛇形命名(如new_record),对应表中的一行数据

正确查询示例

假设你定义的模型类名为Post,查询pid=1的最新条目代码如下:

# 方式1:直接调用字段的desc方法,无需额外导入
latest_record = Post.query.filter_by(pid=1).order_by(Post.content_entered.desc()).first()

# 方式2:使用sqlalchemy自带的desc函数(需要先从sqlalchemy导入desc)
from sqlalchemy import desc
latest_record = Post.query.filter_by(pid=1).order_by(desc(Post.content_entered)).first()

完整流程参考

import datetime
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import desc

# 初始化SQLAlchemy实例
db = SQLAlchemy(app)

# 定义模型类
class Post(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    pid = db.Column(db.Integer, nullable=False)
    content_entered = db.Column(db.DateTime, nullable=False)

# 插入数据
new_post = Post(pid=1, content_entered=datetime.datetime.utcnow())
db.session.add(new_post)
db.session.commit()

# 查询最新数据
latest_post = Post.query.filter_by(pid=1).order_by(Post.content_entered.desc()).first()

内容的提问来源于stack exchange,提问作者Norman Kuo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 21:24:00