如何得到最后的记录

我需要从 DB 那里拿到最后一张唱片,我在用 sql 炼金术。 现在,我是这样做的:

obj = ObjectRes.query.all()
return str(obj[-1].id)

但是这个问题太沉重了,我怎样才能把最后一张唱片做得更好呢?

98666 次浏览

Take a look at Query.first(). If you specify a sort on the right column, the first will be your last. An example could look like this:

obj = session.query(ObjectRes).order_by(ObjectRes.id.desc()).first()

Sometimes it is difficult to reformulate simple things:

SELECT * FROM ObjectRes WHERE id IN (SELECT MAX(id) FROM ObjectRes)

but this worked for me:

session.query(ObjectRes).filter(ObjectRes.id == session.query(func.max(ObjectRes.id)))

Don't forget to disable existing ordering if needed

In my case I have dynamic ordered relationships:

class Match:
...
records = relationship("Record", backref="match", lazy="dynamic", order_by="Record.id")

And when I tried accepted answer I got first record, not the last, cause ORDER BY were applied twice and spoiled the results.

According to documentation:

All existing ORDER BY settings can be suppressed by passing None

So the solution will be:

match = db_session.query(Match).first()
last_record = match.records.order_by(None).order_by(Record.id.desc()).first()

This answer modifies the others to allow for cases where you don't know what the primary key is called.

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()