2016-07-29 4 views
1

Sorry ich bin ein bisschen neu zu all dem.Wie kann ich die Ergebnisse dieser verknüpften Abfrage basierend auf einem der Schlüsselwerte in dict umwandeln?

Ich benutze psycopg2, python und postgres.

Ich habe zwei Tabellen - Benutzer und Ereignisse. Ich habe eine Viele-zu-Viele-Beziehung eingerichtet, da bei einem Ereignis viele Benutzer und Benutzer an vielen Ereignissen teilnehmen können. Es gibt eine Zwischentabelle namens UsersEvents, die die Benutzer-ID mit der Ereignis-ID übereinstimmt. Ich möchte die Liste der Ereignisse und Benutzer in einem dict ähnlich wie diese bekommen:

[ 
    { 
     event_id: 1, 
     event_name : 'event-name', 
     joined : [ 
      {'username' : 'name'}, 
      {'username' : 'name'}, 
      {'username' : 'name'} 
     ] 
    }, 
    { 
     event_id: 2, 
     event_name : 'event2-name', 
     joined : [ 
      {'username' : 'name2'}, 
      {'username' : 'name2'} 
     ] 
    } 
] 

ich eine Abfrage wie diese mit psycopg2 läuft die Liste der Ereignisse und Benutzer mit ihnen verbunden zu bekommen:

SELECT events.id, event_name, users.username 
FROM events 
JOIN usersevents on events_id = events.id 
JOIN users on usersevents.users_id = users.id; 

, die mich wieder so etwas wie dies zurück:

[ 
    (1, 'event-name', 'name'), 
    (1, 'event-name', 'name'), 
    (1, 'event-name', 'name'), 
    (2, 'event2-name', 'name2'), 
    (2, 'event2-name', 'name2') 
] 

So groß es ist, dass sie die Informationen zurückzieht ich brauche, aber jetzt muss ich versuchen, herauszufinden, wie es in das Format oben zu verschmelzen. Gibt es eine bessere Abfrage für das, was ich versuche, oder sollte ich einfach alle Ergebnisse durchlaufen und versuchen, Ergebnisse mit demselben Ereignisnamen zusammenzuführen?

Edit: Ich verstehe, wie Sie die Ergebnisse als Diktat zurückgeben, wie in den Kommentaren darauf hingewiesen. Ich möchte die Zeilen mit doppelten Ereignisnamen aufnehmen und die Benutzer, die diesem Ereignis beitreten, in eine einzelne Diktatzeile für ein einzelnes Ereignisobjekt verschachteln.

+0

Das Format, das Sie sagen, dass Sie wollen, ist in Wirklichkeit kein Diktat, sondern eine Liste von Diktaten. – holdenweb

Antwort

0

Sie möchten für jedes Ereignis eine Datenstruktur nach Namen erstellen. Erstellen Sie ein Diktat, das den Ereignisdaten Namen zuordnet. Erstellen oder aktualisieren Sie für jede Zeile die Daten für das Ereignis. Die Werte aus dem Diktat sind schließlich die Liste der Ereignisdaten.

for id, event, user in results: 
    event = events.setdefault(id, {'event_id': id, 'event_name': name, 'joined': []}) 
    event['joined'].append({'username': user}) 

data = list(events.values()) 
Verwandte Themen