Wie verknüpfe ich drei Tabellen mit SQLalchemy und behalte alle Spalten in einer der Tabellen?

8

Also, ich habe drei Tabellen:

Die Klassenverteidigung:

%Vor%

HINWEIS: Ich weiß, dass user.username eindeutig sein sollte, das muss behoben werden, und ich bin nicht sicher, warum SQLalchemy einige Zeilennamen mit den doppelten Anführungszeichen erstellt.

Und ich versuche, einen Weg zu finden, alle Kanäle abzufragen, sowie einen Hinweis darauf, welche Kanäle ein bestimmter Benutzer (identifiziert durch user.sessionId zusammen mit user.id) abonniert hat.

Nehmen wir zum Beispiel an, wir haben vier Kanäle: channel1, channel2, channel3, channel4; ein Benutzer: user1; Wer hat ein Abonnement auf channel1 und channel4? Die Abfrage für Benutzer1 würde etwas zurückgeben:

%Vor%

Dies ist ein Best-Case-Ergebnis, aber da ich absolut keine Ahnung habe, wie die abonnierte Spalte zu erreichen ist, habe ich stattdessen versucht, die bestimmte Benutzer-ID in den Zeilen zu erhalten, wo der Benutzer ein Abonnement hat und wo a Abonnement fehlt, lass es einfach leer.

Die Datenbank-Engine, die ich zusammen mit SQLalchemy atm verwende. ist sqlite3

Ich habe mir schon seit zwei Tagen den Kopf darüber gekratzt, ich habe kein Problem damit, alle drei über die Abonnement-Tabelle zu verbinden, aber dann werden alle Kanäle ausgelassen, auf denen der Benutzer kein Abonnement hat.

Ich hoffe, ich habe es geschafft, mein Problem ausreichend zu beschreiben, danke im Voraus.

BEARBEITEN : Verwaltet, um das Problem mit einer Unterabfrage leicht zu lösen:

%Vor%

Ich werde jedoch weiterhin nach einer eleganteren Lösung suchen, daher sind die Antworten immer noch sehr willkommen.

    
jimka 26.03.2010, 15:52
quelle

3 Antworten

13

Option-1:

Subscription ist nur ein Viele-zu-Viele-Beziehungsobjekt, und ich würde vorschlagen, dass Sie es als solches anstatt als separate Klasse modellieren. Siehe Viele-zu-viele-Beziehungen konfigurieren von %Code%.

Sie modellieren mit dem Testcode wird:

%Vor%

erzeugt folgende Ausgabe:

%Vor%

Bitte beachten Sie die Verwendung von SQLAlchemy/declarative , die nur 1 SELECT-Anweisung anstelle von 1 für jede eagerload ausgibt, wenn User angefordert wird.

Option-2:

Aber wenn Sie Ihr Modell behalten und nur eine SA-Abfrage erstellen möchten, die Ihnen die Spalten liefert, während Sie fragen, sollte die folgende Abfrage die Aufgabe erledigen:

%Vor%

Die Ausgabe ist absolut dieselbe wie in der obigen Option 1.

    
van 26.03.2010, 22:44
quelle
1

Um dies ein wenig leichter zu machen, habe ich Beziehungen zu Ihrem Modell hinzugefügt, auf diese Weise können Sie einfach usersubscriptions machen, um alle Abonnements zu erhalten.

%Vor%     
Wolph 26.03.2010 17:06
quelle
0

Fragen Sie nicht vom Benutzer ab. Abfrage vom Kanal.

%Vor%

Auf diese Weise erhalten Sie alle Kanäle, nicht nur diejenigen, die dem betreffenden Benutzer zugeordnet sind.

    
jcdyer 26.03.2010 17:58
quelle

Tags und Links