2016-08-01 15 views
0

Ich versuche, Ergebnisse von einer SQLAlchemy-Abfrage zu serialisieren. Ich bin neu im ORM, daher bin ich mir nicht sicher, wie ich eine Ergebnismenge filtern kann, nachdem ich sie abgerufen habe. Die Ergebnismenge sieht wie folgt aus, wenn ich die Objekte glätten:Wie filtere ich SQLAlchemy-Ergebnisse basierend auf dem Wert einer Spalte?

A1 B1 V1

A1 B1 V2

A2 B2 V3

ich serialisiert müssen diese in eine Liste von Objekten, 1 pro eindeutigen Wert für A, jeweils mit einer Liste der V-Werte. IE:

Object1:

  • A: A1

  • B: B1

  • V: {V1, V2}

Object2:

  • A: A2

  • B: B2

  • V: {V3}

Gibt es einen Weg durch alle eindeutigen Werte auf einer bestimmten Spalte zu wiederholen, aber mit der Fähigkeit, um eine Liste von Werten aus den anderen Spalten zurückzugeben?

Antwort

0

Yup verwenden nur func.array_agg und group_by

import sqlalchemy.sql.functions as func 
session.query(Object.col1, Object.col2, func.array_agg(Object.col3)) 
    .group_by(Object.col1) 
    .group_by(Object.col2) 
    .all() 

Aber dies wird nur mit Datenbank-Backends mit einer äquivalenten Aggregationsfunktionen arbeiten, abgesehen davon, dass Sie gehen, um nur Ihre eigene Gruppe von Pseudo-Funktion zu schreiben. Sql Alchemy übersetzt einfach nur Ihren Pythony-Code in die entsprechende SQL, die andere Logik bleibt normalerweise dem Programmierer überlassen.

Equivalent Postgresql

SELECT col1, col2, array_agg(col3) 
FROM objects 
GROUP BY col1, col2; 
0

Es stellte sich heraus, dass ich Zuordnungstabellen zu verwenden, erforderlich und die joinedload() Funktion. Die Dokumentation ist ein bisschen wackelig, aber ich habe es geschafft, nachdem ich eine Weile damit gespielt habe.