2017-03-14 6 views
0

Ich möchte den zuletzt geänderten Datensatz für jeden Benutzer in meiner Datenbank speziell mithilfe von sqlalchemy orm erhalten. Hier ist, was ich versuche:Zuletzt geänderten Datensatz für jeden Benutzer

session.query(Object)\ 
     .group_by(Object.user_id)\ 
     .order_by(Object.updated_at.desc())\ 
     .first() 

Aber immer folgende Fehlermeldung:

(psycopg2.ProgrammingError) column "object.id" must appear in the GROUP BY clause or be used in an aggregate function 

Antwort

1

Die Ursache für diesen Fehler ist, dass Sie group_by ohne Aggregationsfunktion verwendet haben. so etwas wie dies Es wird für jeden Benutzer

from sqlalchemy import func 
session.query(Object.user_id, func.max(Object.updated_at)).group_by(Object.user_id).all() 

Versuchen Sie, den letzten updated_at Wert zurück. Es ist sinnvoll, group_by nur zu verwenden, wenn mehrere Datensätze in der Tabelle Object mit demselben user_id vorhanden sind.

+0

ja das ist eine gute Problemumgehung. aber ich möchte den gesamten letzten Datensatz für jeden Benutzer und nicht nur, wenn dieser Datensatz aufgetreten ist, zurückgeben. müsste ich Abfragen kombinieren? – dataflow

+1

Ich sehe Sie postgresql verwenden. In postgresql sollte die Abfrage 'Select distinct on (user_id) * aus der Tabellenreihenfolge nach user_id, updated_at desc 'funktionieren. In ORM können Sie 'session.query (Object) .distinct (Object.user_id) versuchen. Order_by (Object.user_id, Object.updated_at.desc()). All()' –

+1

@wotalf hilft es? –

Verwandte Themen