Lassen Sie sich sagen, ich habe diese Tabellen mit pony.orm
abgebildet:pony.orm sortiert nach neuestem Entity in Beziehung
class Category(db.Entity):
threads = Set("Thread")
class Thread(db.Entity):
category = Required("Category")
posts = Set("Post")
class Post(db.Entity):
thread = Required("Thread")
timestamp = Required(datetime)
Jetzt möchte ich alle Themen einer bestimmten Kategorie von dort neuester Post bestellt bekommen:
Mit dieser Zeile bekomme ich die ID des neuesten Posts, aber ich will das Objekt.
query = select((max(p.id), p.thread) for p in Post if p.thread.category.id == SOME_ID)
.order_by(lambda post_id, thread: -post_id)
Natürlich konnte ich [(Post[i], thread) for i, thread in query]
oder select(p for p in Post if p.id in [i for i,_ in query])
Aber das schafft zusätzliche SQL-Anweisungen. Also meine Frage ist: Wie kann ich die neuesten Beiträge aller Threads in einer bestimmten Kategorie nach dem Zeitstempel dieses Beitrags mit einer einzigen SQL-Anweisung erhalten.
Ich würde nicht db.execute(sql)
verwenden, wenn Sie das ORM nicht verwenden können.
Wow, das ist, warum ich pony.orm lieben: Es ist nur Python. Aber was ich nicht verstehe: Warum ist 'select (t für t in category.threads) 'ungültig ->" über Nicht-Entity-Objekt iterierend ", sondern' select (p für t in Thread für p in t.posts) ' fein? In beiden Fällen wiederhole ich eine 'Set'-Beziehung. – Wombatz
'select (t für t in category.threads)' sollte auch in Ordnung sein, aber die entsprechende Übersetzungslogik ist noch nicht implementiert. Es sollte relativ einfach sein, aber andere Aufgaben waren dringender. Ich hoffe, wir können es bald umsetzen. –