我需要从数据库中获取最后一条记录。我正在使用SQLAlchemy。 目前,我的做法是这样的:
obj = ObjectRes.query.all()
return str(obj[-1].id)
但是这个查询太重了。我如何更好地获取最后一条记录?
我需要从数据库中获取最后一条记录。我正在使用SQLAlchemy。 目前,我的做法是这样的:
obj = ObjectRes.query.all()
return str(obj[-1].id)
但是这个查询太重了。我如何更好地获取最后一条记录?
请看Query.first()
。如果在正确的列上指定了排序,则第一个将是最后一个。示例如下:
obj = session.query(ObjectRes).order_by(ObjectRes.id.desc()).first()
SAWarning: Can't resolve label reference '-id'; converting to text() (this warning may be suppressed after 10 occurrences)
。在使用过程中需要将标签引用'-id'转换为文本形式来解决这个问题。这个警告可能会在出现10次后被隐藏。 - Shift 'n TabModel.query.order_by(-Model.field_name).first()
来检索所需的对象。 - Pratik K.ORDER BY desc LIMIT 1
这样的智能操作? - Adam HughesSELECT * FROM ObjectRes WHERE id IN (SELECT MAX(id) FROM ObjectRes)
session.query(ObjectRes).filter(ObjectRes.id == session.query(func.max(ObjectRes.id)))
不要忘记在需要的情况下禁用现有的排序
在我的情况下,我有动态有序关系:
class Match:
...
records = relationship("Record", backref="match", lazy="dynamic", order_by="Record.id")
当我尝试接受答案时,我得到了第一条记录,而不是最后一条,因为ORDER BY
被应用了两次,破坏了结果。
根据文档:
通过传递None可以抑制所有已存在的 ORDER BY 设置。
所以解决方案将是:
match = db_session.query(Match).first()
last_record = match.records.order_by(None).order_by(Record.id.desc()).first()
这个答案修改了其他答案,以允许在不知道主键名称的情况下进行操作。
from sqlalchemy.inspection import inspect
# ...
def last_row(Table: type, *, session): # -> Table
primary_key = inspect(Table).primary_key[0].name # must be an arithmetic type
primary_key_row = getattr(Table, primary_key)
# get first, sorted by negative ID (primary key)
return session.query(Table).order_by(-primary_key_row).first()