Seite 1 von 1

SQLAlchemy/Soup: Relationships

Verfasst: Donnerstag 17. März 2011, 17:45
von sprudel
Hallo,
ich habe mal eine Frage zu den Relationships.
Wie auch immer ich meine Tabellen gestalte (Mysql mit InnoDB),

ich bekomme immer diese Meldung:

sqlalchemy.exc.ArgumentError: Could not determine join condition between parent/child tables on relationship MappedProducts.products_notes. Specify a 'primaryjoin' expression. If this is a many-to-many relationship, 'secondaryjoin' is needed as well.


Ich würde eben gerne eine 1:n - Relation so abbilden.
Wisst ihr wie das geht?

Liebe GRüße
Chris

Re: SQLAlchemy/Soup: Relationships

Verfasst: Donnerstag 17. März 2011, 18:58
von BlackJack
@sprudel: SQLAlchemy kann halt nicht automatisch heraus finden über welche Attribute die beiden Tabellen denn nun eigentlich verbunden sind. Das musst Du angeben.

Re: SQLAlchemy/Soup: Relationships

Verfasst: Donnerstag 17. März 2011, 19:22
von sprudel
Ich habe nicht so recht verstanden wie ich das angeben kann.
Auch habe ich über Google und die Forensuche keine Beispiele gefunden.
Überall im Netz funktioniert es auch ohne diese Angabe :-/

Kann mir wer sagen, wie die Syntax dafür ist?

Re: SQLAlchemy/Soup: Relationships

Verfasst: Donnerstag 17. März 2011, 19:37
von Hyperion
Zeig uns doch mal Deinen bisherigen Code. das dürfte einfacher sein, dafür die entsprechenden Ergänzungen vorzunehmen, als ein triviales Drittbeispiel zu schustern - zumal es dafür sicherlich viele Beispiele im Netz geben dürfte. In der SQLAlchemy-Doku muss doch dazu etwas drin stehen. Ich kenne diese Soup-Aufsatz nicht, aber da es nur ein Aufsatz ist, können die grundlegenden Prinzipien ja nicht ausgehebelt werden. Zumal in der Doku dazu ja auch etwas diesbezüglich stehen sollte.

Re: SQLAlchemy/Soup: Relationships

Verfasst: Donnerstag 17. März 2011, 19:54
von sprudel
Habe noch keinen konkret funktionierenden Code, sondern nur eine Beispieldatenbank.

In dem Fall gibt es products und product_notes


da dan:

database.db.products.relacte("product_notes",database.db.product_notes)

Und da entsteht dabei dann diese Meldung ;)

Bei den DAtenbanken hat jeweils das Feld "pid" den Primärschlüssel, eine Beziehung ist im Designer von PHPMyadmin erstellt worden.

Re: SQLAlchemy/Soup: Relationships

Verfasst: Donnerstag 17. März 2011, 20:24
von BlackJack
@sprudel: Es ist echt mühsam Dir die Informationen zu entlocken. Nun kennen wir die Tabellennamen und wissen, dass die beide eine 'pid' als Primärschlüssel haben. Und wir stellen uns die gleiche Frage wie SQLAlchemy auch: wie heisst denn nun der Fremdschlüssel in 'product_notes'?

Re: SQLAlchemy/Soup: Relationships

Verfasst: Donnerstag 17. März 2011, 20:43
von Hyperion
BlackJack hat geschrieben:Und wir stellen uns die gleiche Frage wie SQLAlchemy auch: wie heisst denn nun der Fremdschlüssel in 'product_notes'?
(K.A. wie das mittlerweile bei den zig Dutzend Speicher-Formaten bei MySQL ist, aber es gibt ja in SQL tatsächlich eine Fremdschlüsseldeklaration, die das automatisierte Zuordnen erlauben sollte. Da stellt sich mir recht Offtopic die Frage, inwiefern SQLAlchemy aus Konsistenzgründen (kleinster gemeinsamer Standard) darauf verzichten will oder ob es das sogar tatsächlich erkennen kann?)

Re: SQLAlchemy/Soup: Relationships

Verfasst: Donnerstag 17. März 2011, 21:17
von BlackJack
@Hyperion: Wenn die ordentlich deklariert und eindeutig sind, kann SA das eigentlich erkennen. Ich musste das bisher immer nur in mehrdeutigen Fällen explizit sagen. Zum Beispiel bei einer 'personen'-Tabelle die 'wohnsitz_id' und 'zweitwohnsitz_id' als Fremdschlüssel in eine 'adressen'-Tabelle hatte. Wenn ich da nun sage ich möchte eine Beziehung mit Namen 'xyz' zwischen 'personen' und 'adressen', weiss SA natürlich nicht über welchen der beiden Fremdschlüssel ich die nun gerne hätte.

Re: SQLAlchemy/Soup: Relationships

Verfasst: Donnerstag 17. März 2011, 21:18
von noisefloor
Hallo,
database.db.products.relacte("product_notes",database.db.product_notes)
IMHO stimmt die Syntax nicht... entweder ist "database" oder "db" zu viel...

@sprudel: Wenn's so nicht geht, nimm' doch einen manuelle Join ;-)

Gruß, noisefloor