Die Lösung von univerio funktioniert gut, es sei denn es einen Fehler aus, wenn Sie eine Spalte von den angegebenen Werten wählen:
>>> q = session.query(Comment, c.x.id).join(x, Comment.id == x.c.id).order_by(x.c.ordering)
>>> q.all()
ProgrammingError (ProgrammingError) table name "x" specified more than once
Dies liegt daran, die Werte in der bevölkerten Entfliehen und das JOIN Block
>>> print(q)
SELECT comments.id AS comments_id, x.ordering as x_ordering
FROM (VALUES (1, 1), (3, 2), (2, 3), (4, 4)) AS x (id, ordering), comments
JOIN (VALUES (1, 1), (3, 2), (2, 3), (4, 4)) AS x (id, ordering) ON comments.id = x.id ORDER BY x.ordering
Die Lösung besteht darin, die Werte aus der FROM-Anweisung zu verbergen:
class values(FromClause):
named_with_column = True
def __init__(self, columns, *args, **kw):
self._column_args = columns
self.list = args
self._hide_froms.append(self) # This line fixes the above error
self.alias_name = self.name = kw.pop('alias_name', None)
def _populate_column_collection(self):
for c in self._column_args:
c._make_proxy(self)
Nun, es funktioniert:
>>> q = session.query(Comment, c.x.id).join(x, Comment.id == x.c.id).order_by(x.c.ordering)
>>> print(q)
SELECT comments.id AS comments_id, x.ordering as x_ordering
FROM comments JOIN (VALUES (1, 1), (3, 2), (2, 3), (4, 4)) AS x (id, ordering) ON comments.id = x.id ORDER BY x.ordering
Bitte teilen Sie Ihre Gedanken, wenn Sie downvote. – turkus
Es verwendet zwei Abfragen und eine temporäre Tabelle, wenn eine einzelne Abfrage ausgeführt wird. – univerio
@univerio danke. Ich sah, dass Sie es auf andere Weise (eine Abfrage) unten getan haben, aber drootnar fragt nach sqlalchemy, ohne irgendwelche rohen Elemente der Abfrage, ich kenne die Lösung, die Sie geschrieben haben. Wie auch immer funktioniert Ihre Lösung mit anderen Datenbanken (nicht nur PostgreSQL)? – turkus