Wie legen Sie Tabellenbeziehungen in SQLAlchemy mit mehrstufigen / mehreren Joins fest?

8

Ich versuche, eine Beziehung zwischen zwei Tabellen zu definieren, deren Beziehungen indirekt sind (d. h. durch zwei andere Tabellen).

Die Ergebnisse, nach denen ich suche, können mit dieser Abfrage abgerufen werden:

%Vor%

Dabei ist customer ein Kundenobjekt.

Ich habe Mühe herauszufinden, wie dies als eine Beziehung definiert werden würde, ähnlich der Beziehung Customer.invoices . Eine Idee, die ich hatte, war etwa so:

%Vor%

Wie aus diesem Beitrag hervorgeht, funktioniert das nicht. Die Fehlermeldung, die es erzeugt, ist dies: sqlalchemy.exc.ArgumentError: Could not locate any simple equality expressions involving locally mapped foreign key columns for primary join condition 'accounts.user_id = customers.id AND accounts.account_id = subscriptions.account_id AND pstn_numbers.sub_id = subscriptions.id' on relationship Customer.telnums. Ensure that referencing columns are associated with a ForeignKey or ForeignKeyConstraint, or are annotated in the join condition with the foreign() annotation. To allow comparison operators other than '==', the relationship can be marked as viewonly=True.

Könnte mir jemand in die richtige Richtung weisen?

Ich habe die folgende Tabellenstruktur (vereinfacht, alle irrelevanten Spalten abgesehen von einer für jede Tabelle entfernt):

%Vor%     
orn 06.03.2014, 15:39
quelle

1 Antwort

8

Im Allgemeinen würde ich eine indirekte Beziehung nicht als relationship definieren, da Sie riskieren, dass diese indirekten Beziehungen nicht mehr synchron sind, wenn Sie Änderungen vornehmen. Sie können einige dieser Einschränkungen umgehen, indem Sie die % co_de angeben % Parameter für ein viewonly=False .

Eine einfachere, weniger riskante und einfachere Lösung wäre die Verwendung einer Abfrage (oder einer query-fähigen Eigenschaft) für den Fall, dass Sie Daten aus der Datenbank neu laden und Python-Listen-Comprehensions verwenden möchten, um Untergeordnete Elemente des Beziehungsbaums:

%Vor%     
van 07.03.2014, 06:55
quelle