SQLAlchemy/Soup: Relationships

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
sprudel
User
Beiträge: 250
Registriert: Donnerstag 8. März 2007, 17:12

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
BlackJack

@sprudel: SQLAlchemy kann halt nicht automatisch heraus finden über welche Attribute die beiden Tabellen denn nun eigentlich verbunden sind. Das musst Du angeben.
sprudel
User
Beiträge: 250
Registriert: Donnerstag 8. März 2007, 17:12

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?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
sprudel
User
Beiträge: 250
Registriert: Donnerstag 8. März 2007, 17:12

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.
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'?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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?)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
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.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
Antworten